已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
4小时前关门了。
Improve this question
有谁能用一两个例子解释一下下面的C++代码是如何将十进制转换成二进制的吗?我知道其他的方法,但是这个方法是不理解的。
# include < bits/stdc++.h>
using namespace std;
int DecimalToBinary (int n)
{
int x = 1;
int ans = 0;
while (x <= n)
{
x *= 2;
}
x/=2;
while (x>0)
{
int lastDigit = n/x;
n -= lastDigit*x;
x/=2;
ans = ans*10 + lastDigit;
}
return ans;
}
int 32_t main () {
int n;
cin >> n;
cout << decimalToBinary (n) << end l;
}
1条答案
按热度按时间qv7cva1a1#
此代码基本上分为两部分:
当(x ≤ n){ x *= 2;}
x/=2;
然后这部分。
当(x〉0){整数最后一位数= n/x;
}
最上面的部分是找出你的数字有多大,基本上,它一直把x翻倍,直到它大于你输入的数字,然后它后退一位,让我们用一个输入数字的例子-- 6。在十进制中,这是110。
然后第二部分开始构建输出,一次构建一个十进制值。
然而,这是一个非常糟糕的方法。非常糟糕。对于任何稍微大的数字,你都会溢出你的
ans
变量。这是最大的问题。无论你从哪里得到这个代码,不要再相信那个来源了。但是让我们把这个循环分解一下,首先,直到你把x除到0,它循环,所以在输入为6的情况下,x是4(如我所概述的),然后第一个循环,x是4,然后2,然后1,然后0,所以它停止,它循环了3次。
让我们倒过来看看。
第一次,ans是0,所以ans*10也是0,所以我们加上lastDigit,这实际上是前面的二进制数,记住,n是7,x是4,6 / 4 == 1(这里是整数运算,不是浮点运算),所以ans现在是1,这是第一位数,我们还从n中减去4,所以现在是2。
循环2,n现在是2,x也是2。2/2是1,所以ans变成了ans * 10 == 10 + 1,所以是11。我们已经从2中减去2,所以n现在是0。
最后一次,0 / 1 == 0,所以我们得到110。
但这仍然是一个非常糟糕的方法。至少,由于溢出问题,它应该以其他格式存储结果。