2017-01-21 56 views
0

我正在帮助一个C++作业的朋友。有一个与如下因素基地转换器功能的问题:问题与基地转换器功能

#include <iostream> 
#include <cmath> 
using namespace std; 

int strToInt(string num, unsigned base){ 
    int result = 0; 
    for (int i=0; i<num.length(); i++) { 
     if (num[i]>='0' && num[i]<='9') 
      result += (num[i]-'0')*pow(base,num.length()-i-1); 
     else if (num[i]>='A' && num[i]<='F') 
      result += (num[i]-'A'+10)*pow(base,num.length()-i-1); 
     else if (num[i]>='a' && num[i]<='f') 
      result += (num[i]-'a'+10)*pow(base,num.length()-i-1); 
    } 
    return result; 
} 

int main() 
{ 
    string number; 
    int base; 
    while(number.compare("exit")!=0){ 
     cin>>number; 
     cin>>base; 
     cout<<strToInt(number,base)<<"\n\n"; 
    } 
    return 0; 
} 

对于每一个我进入3个5位小数,并选择基地10我得到了正确数量-1时一些莫名其妙的原因。

E.g.

100 
10 
99 

10000 
10 
9999 

我已经打算在这个函数的最后5-6小时,加入所有类型的调试代码,但对我的好,我也弄不清到底是什么错误。

代码风格的言论也非常赞赏。

干杯

+0

@latedeveloper关于幻数的好处。更可读。 但是我没有看到==和compare()之间的区别。 通过测试返回值是什么意思?验证?这不是任务的要求。 感谢您的反馈意见。 –

+0

您是否尝试通过调试器逐步执行代码?当代码行为不正确时,调试器就是要使用的**工具。 –

+1

我无法复制;与您的输入我得到100-10-100和10000-10-10000 –

回答

2

std::pow做浮点运算。你可能会在某个地方遇到一个舍入错误。通常累加值的方法是每次循环乘以并加上:

result *= base; 
result += ch - '0'; 
+0

是的,更优雅的解决方案,谢谢! –