2013-09-30 45 views
0

創建二進制到十進制轉換器;有大部分的裸骨頭,但我有一個問題 - 程序從左到右讀取二進制數,而不是從右到左(正如通常通過手寫計算一樣)。正因爲如此,「1111」,「10001」和「10101」等輸入作爲正確的小數回答出現,但某些輸入如「10011」顯然不正確。二進制到十進制轉換器的字符數組

TL; DR哪種方式最適合於翻轉循環如何通過char數組?

示例代碼:

for (i = 0; i < 33 && binary[i] != '\0'; i++, power++) 
{ 
    if (binary[i] == '0') 
    continue; 

    else if (binary[i] == '1') 
    decimal = pow (2,power) + decimal; 

    else 
    { 
    cout << "Invalid input." << endl; 
    return 0; 
    } 
} 

回答

0

它看起來與你在上面,要麼寫你的字符串代碼正好是33位數,或者如果它更短,它將被終止。我只問,因爲這有點奇怪,如果(例如)你可以讓它總是空終止,它會更好。這將簡化代碼。

但如果這是怎麼回事,然後將下面的代碼應該工作

// find the number of digits 
int num_digits = 0; 
while (num_digits < 33 && binary[num_digits] != '\0') 
    ++num_digits; 

// now we have the number of digits we can ... 
// ... loop backwards through the string 
for (int i = num_digits; i > 0;) 
{ 
    --i; 
    if (binary[i] == '0') 
     continue; 

    else if (binary[i] == '1') 
     decimal = pow (2,power) + decimal; 

    else 
    { 
     cout << "Invalid input." << endl; 
     return 0; 
    } 
} 

我看你已經收到被假設你的字符串總是空終止其他的答案。如果那是真的,那麼你應該選擇其中的一個答案。

0

你可以用下面的閱讀從年底開始的數組,

int pos_of_zero = strlen(binary); 

for(int i = pos_of_zero - 1; i > -1; --i, power++) 
{ 
    // .... 
+0

這會取代我的其他for循環?因爲當我嘗試這個時,我每次都會收到「無效輸入」。 – majortom

+0

是的。你需要替換你的。 –

0

你可以做以下

for (i = strlen(binary) - 1; i >= 0; --i) { 

} 

這樣,如果你有一個二進制數字「10011」,for循環會經過位順序:1 - > 1 - > 0 - > 0 - > 1.

您可以通過避免調用pow函數來更有效地計算二進制數的十進制值。

for (int i = 0, decimal = 0; i < strlen(binary); ++i) 
    decimal = decimal*2 + (binary[i] - '0'); 
+0

與其他答案相同,每次都會收到「無效輸入」。 – majortom

+0

您需要調整我給出的代碼部分以適合您的實現。您可能正在訪問二進制數組中不屬於二進制數的二進制數組的位置i。我試圖說的是,for循環可以從0到(size_of_binary - 1)或從(size_of_binary - 1)到0。或者,您仍可以從0到(size_of_binary -1)並計算十進制值使用公式decimal = decimal * 2 +(binary [i] - '0'),避免多次調用pow()。 –