我的任务是编写一些代码,这些代码将用户输入并将数字转换为二进制数。到目前为止我已经编写了一些代码,但我遇到了一个问题。我必须使用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;
}
感谢任何帮助,谢谢!
答案 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的幂,直到整数的最大位值。我还假设您不会使用浮点数。转换为浮点二进制值很头疼。