2013-09-30 46 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()。 –