C ++如何将十进制数转换为二进制数?

时间:2016-10-09 18:53:47

标签: c++ loops for-loop binary decimal

我的任务是编写一些代码,这些代码将用户输入并将数字转换为二进制数。到目前为止我已经编写了一些代码,但我遇到了一个问题。我必须使用for循环和quotient-remainder方法。当我输出余数(二进制)时,它不会打印最后一位数字。

我问的问题是:在for循环中我需要更改什么才能打印出二进制数的最后一位?

int main()
{
    int num;
    int rem;

    cout << "Please enter a number: ";
    cin >> num;

    for (int i = 0; i <= (num + 1); i++)
    {
        num /= 2;
        rem = num % 2;
        cout << rem;
    }

    _getch();
    return 0;
} 

感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:3)

通过将num除以2来启动算法时丢失了最后一个二进制数。要避免此问题,您应该同时交换num /= 2;rem = num % 2;

这两个说明

你的循环也会迭代太多次:实际上你可以在num == 0时停止。以下代码对于&lt; = 0。

的输入无效
int main()
{
    int num;
    int rem;

    cout << "Please enter a number: ";
    cin >> num;

    while (num != 0)
    {
        rem = num % 2;
        num /= 2;
        cout << rem;
    }
    cout << std::endl;

    return 0;
} 

如果您想以正确的顺序编写,则应首先在基数2中计算数字的日志。以下解决方案使用以“1”开头且数字为“0”的数字index后:

int main()
{
    int num;
    int rem;

    cout << "Please enter a number: ";
    cin >> num;

    if (num > 0) {
      int index = 1;
      while (index <= num)
         index *= 2;
      index /= 2;

      do {
        if (num >= index) {
           cout << '1';
           num -= index;
        }
        else
           cout << '0';
        index /= 2;
      } while (index > 0);
      cout << std::endl;
    }
    else
      cout << '0';

    cout << endl;
    return 0;
} 

答案 1 :(得分:0)

您需要更改

中的行
.length

<!DOCTYPE html>
<html>

<head>
  <style>
    table,
    tr,
    td {
      border: 1px solid #000;
    }
  </style>
  <script>
    window.onload = function() {
      var winners = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
        [1, 5, 9],
        [3, 5, 7],
        [1, 4, 7],
        [2, 5, 8],
        [3, 6, 9]
      ];
      var clicked = [];
      var p = document.querySelectorAll("table td p");
      for (el of p) {
        el.onclick = function() {
          if (this.innerHTML !== "x") {
            this.innerHTML = "x";
            clicked.push(+this.id.match(/\d/).pop());
          };
          var win = winners.some(function(winner) {
            return winner.every(function(n) {
              return clicked.indexOf(n) > -1 
                     && document.querySelector("[id$='" + n + "']")
                        .innerHTML === "x"
            })
          });
          setTimeout(function() {
            if (win) {
              alert("winner");
              clicked.length = 0;       
              for (el of p) {
                el.innerHTML = "<a href='#'>N/A</a>"
              }
            }
          }, 1000)
        }
      }
    }
  </script>
</head>

<body>
  <table>
    <tr>
      <td>
        <p id="s1"><a href="#">N/A</a>
        </p>
      </td>

      <td>
        <p id="s2"><a href="#">N/A</a>
        </p>
      </td>

      <td>
        <p id="s3"><a href="#">N/A</a>
        </p>
      </td>
    </tr>
    <tr>
      <td>
        <p id="s4"><a href="#">N/A</a>
        </p>
      </td>

      <td>
        <p id="s5"><a href="#">N/A</a>
        </p>
      </td>

      <td>
        <p id="s6"><a href="#">N/A</a>
        </p>
      </td>
    </tr>
    <tr>
      <td>
        <p id="s7"><a href="#">N/A</a>
        </p>
      </td>

      <td>
        <p id="s8"><a href="#">N/A</a>
        </p>
      </td>

      <td>
        <p id="s9"><a href="#">N/A</a>
        </p>
      </td>
    </tr>
  </table>
</body>

</html>

这将以相反的顺序打印二进制数。我建议将for循环更改为while(num> 0)并将每个数字添加到数组而不是cout。稍后从左到右打印数组以获得正确的二进制顺序。

答案 2 :(得分:-2)

这个想法是使用数学。将基数10整数转换为基数2.另一种方法可能是通过测试整数值来对比特进行横向,对齐2的幂,直到整数的最大位值。我还假设您不会使用浮点数。转换为浮点二进制值很头疼。