统计1到n总set-bits的C++循环代码错误排查
代码核心问题说明
- 关键逻辑错误:外层循环控制变量被篡改
外层for循环的设计目标是依次遍历1到n的每一个整数,对每个整数单独统计二进制中1的个数(set bit)并累加结果。但你在内层while做逐位检查时,直接对用于外层遍历的循环变量i执行右移操作,把i的值逐步移位到0,完全破坏了外层循环的遍历节奏。 - 实际运行表现
只要输入的n>=1,程序会直接陷入无限循环,根本无法正常输出结果:- 程序完成初始化后,第一次进入循环体时i=1,内层while检测到i的最低位为1,res累加1,随后i被右移操作改为0,内层循环退出
- 循环体执行完毕后,for循环触发自增逻辑:i从0自增为1,此时回到循环条件判断,依然满足
i<=n的要求,会再次进入循环体 - 整个过程永远不会遍历到2、3…n这些待统计的数字,res会持续累加,程序既不退出也不会输出最终的统计值。
简单修正方案
统计单个数字的set bit时,不要直接修改原遍历用的i,新增一个临时变量承接右移操作即可,修改后的核心循环逻辑如下:
for(int i=1;i<=n;i++) { int cur = i; // 用临时变量存储当前待统计的数字,避免修改原循环变量 while(cur > 0) { if((cur & 1) == 1) // 检查最低位是否为1 { res++; } cur = cur >> 1; // 右移临时变量,逐位检查 } }
内容的提问来源于stack exchange,提问作者user14270011
相关产品推荐
相关产品推荐

