这是任务:
“任务 编写一个程序,输入一个自然数,即无符号整型数 n,并以正确的顺序输出 n 的二进制数字(即从最高有效位开始)。不要输出前导零。
限制:只允许使用iostream标准库头;不允许使用数组或字符串。”
我的程序可以毫无问题地处理小整数,但无法通过大整数(例如 40 亿)的测试。每当某些变量超出无符号整数的数字限制时,我都会进行检查,但我找不到溢出问题。 结果是 1 的无限循环。
#include <iostream>
#include <limits>
int main() {
unsigned int n;
std::cin>>n;
unsigned int checker=0;
unsigned int pr_checker=0;
bool counter=true;
//generate the max power of 2
for (unsigned int i=1; i<=n && i!=0; i*=2){
pr_checker=i*2;
checker=i;
}
if(n==0){
std::cout<<0<<"\n";
}
if (n==1){
std::cout<<1<<"\n";
}
if (n>1){
while(counter==true){
if (n==0 && checker==0 && pr_checker==1){
counter=false;
}
else if (n>=checker){
n=n-checker;
pr_checker=pr_checker/2;
checker=checker/2;
std::cout<<1;
}
else if(n<checker){
pr_checker=pr_checker/2;
checker=checker/2;
std::cout<<0;
}
}
}
return 0;
}
我不知道程序的问题出在哪里
有一种更简单的方法可以做到这一点,一次遍历您的
n
的各个部分。
创建具有最高有效位集的单个位掩码。
使用按位
AND
运算符测试该位是否在 n
中设置 - 然后输出 1
。否则,如果您已经看到至少一个 0
(以跳过前导零),则输出 1
。