0

2 進数から 10 進数へのコンバーターを作成します。最低限の骨のほとんどを持っていますが、問題があります.プログラムは2進数を右から左ではなく左から右に読み取ります(通常、手書きで計算する場合と同じように)。このため、「1111」、「10001」、「10101」などの入力は正しい 10 進数の答えとして出てきますが、「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

次のことができます

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

}

このように、2 進数 "10011" がある場合、for ループは 1 -> 1 -> 0 -> 0 -> 1 の順序でビットを通過します。

pow 関数の呼び出しを避けることで、より効率的な方法で 2 進数の 10 進数値を計算できます。

for (int i = 0, decimal = 0; i < strlen(binary); ++i)
    decimal = decimal*2 + (binary[i] - '0'); 
于 2013-09-30T21:31:17.570 に答える
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 桁になるか、それより短い場合は null で終了することがわかります。それは少し奇妙だからです。(たとえば) 常に null で終了できるようにするとよいでしょう。これにより、コードが簡素化されます。

しかし、それがその方法である場合、次のコードは機能するはずです

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

あなたが受け取った他の回答は、あなたの文字列が常にヌルで終わると仮定していることがわかります。それが本当なら、あなたはそれらの答えの1つを使うべきです.

于 2013-09-30T21:30:11.307 に答える