我的代码不起作用,但我不明白原因

问题描述 投票:0回答:1

这是任务:

“任务 编写一个程序,输入一个自然数,即无符号整型数 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;
} 

我不知道程序的问题出在哪里

c++ infinite-loop buffer-overflow
1个回答
0
投票

有一种更简单的方法可以做到这一点,一次遍历您的

n
的各个部分。

创建具有最高有效位集的单个位掩码。

使用按位

AND
运算符测试该位是否在
n
中设置 - 然后输出
1
。否则,如果您已经看到至少一个
0
(以跳过前导零),则输出
1

© www.soinside.com 2019 - 2024. All rights reserved.