2017-01-21 58 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

是的,更優雅的解決方案,謝謝! –