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;
  }
}
4

3 回答 3

0

您可以使用以下内容从头到尾读取数组,

int pos_of_zero = strlen(binary);

for(int i = pos_of_zero - 1; i > -1;  --i, power++)
{
   // ....
于 2013-09-30T21:28:01.203 回答
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;
    }
}

我看到您收到的其他答案是假设您的字符串始终为空终止。如果这是真的,那么您应该选择其中一个答案。

于 2013-09-30T21:30:11.307 回答
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'); 
于 2013-09-30T21:31:17.570 回答