我最近开始学习C++,很抱歉,如果我犯了一个愚蠢的错误...为什么我必须除以49才能得到正确的答案.例如,如果我输入"1111",则答案是735而不是15.所有数字都会发生这种情况,例如,如果我输入"10",则答案是98而不是2.同样,为什么我的cout显示为含糊不清?即时通讯使用visual studio 2013.(注意49分区发生在最后一行)
void binaryToDecimal() {
string number = getNumber();
int sum = 0;
int factor = 1;
for (int i = number.length() - 1; i >= 0; i--) {
if (number.at(i) != '0' && number.at(i) != '1') {
cout << "Number is not in binary form" << endl;
system("pause");
exit(1);
}
if (number.at(i) == '1') {
sum += number.at(i) * factor;
}
factor *= 2;
}
cout << "\'" << number << "\' in binary is \'" << sum / 49 << "\'" << endl;
}
Run Code Online (Sandbox Code Playgroud)
strings中的字符存储在内部与ints不同.这个小代码片段有望帮助您更好地理解神奇的数字.
#include <iostream>
#include <string>
using namespace std;
int main(void){
std::string test("1234");
for(size_t i = 0; i < test.size(); i++){
std::cout << static_cast<int>(test.at(i)) << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个输出是:
49
50
51
52
Run Code Online (Sandbox Code Playgroud)
特别要注意,将字符串"1"转换为a的int值为49.
为了避免这种神奇的数字方法,你可能想要做两件事之一:
使用字符串转换为int boost::lexical_cast或'stringstream`首先将字符串转换为整数表示然后处理它.但是,这会改变逻辑,因为您现在正在使用一些不同的数学.
或者如果你想保持逻辑大致相同,那么最简单的事情就是在char你经过输入阶段后不要在内部处理:
using namespace std;
bool binaryToDecimal() {
string raw_input("101");//This would be your get_number function
int sum = 0;
int factor = 1;
for (size_t i = raw_input.length()-1; i > 0; i--) { //I think you also had an off by one error here
if (raw_input.at(i) != '0' && raw_input.at(i) != '1') {
cout << "Number is not in binary form" << endl;
return false;
}
if (raw_input.at(i) == '1') {
sum += factor; //Previously you had a completely unnecessary number.at(i) in here
}
factor *= 2;
}
cout << "\'" << raw_input << "\' in binary is \'" << sum << "\'" << endl; //No more magic number required now!
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |