求反复将数字除以2至结果为0的次数及Java代码问题排查
修正你的“反复除以2计数”代码
首先,咱们先梳理下你原代码里的几个核心问题:
- 循环条件完全搞反了:你写的
while (k == 0),意思是只有当k等于0时才会进入循环,但初始k是i/2(比如输入40的话k是20),所以循环根本不会执行。 - 变量职责混乱:你试图用k同时存储除法结果和计数,这直接导致逻辑错乱。
- 计数逻辑缺失:没有专门的变量来统计除法操作的次数,也没实现“反复除以2直到0”的核心逻辑。
接下来是修正后的代码,我会逐行解释关键改动:
import java.util.Scanner; public class DivideByTwoCounter { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter A Number:"); try { int num = sc.nextInt(); int count = 0; int current = num; // 循环逻辑:只要当前数还没变成0,就继续执行除法 while (current != 0) { current = current / 2; // 执行除以2的操作 count++; // 每完成一次除法,计数加1 // 可选:打印每次的计算结果,和你例子里的过程一致 // System.out.println(current); } System.out.println("总共进行了 " + count + " 次除法"); } catch (Exception e) { // 新增异常处理,防止输入非数字的情况 System.out.println("请输入有效的整数!"); } finally { sc.close(); // 别忘了关闭Scanner资源,避免内存泄漏 System.out.println("done"); } } }
关键修正点说明:
- 拆分变量职责:用
current存储当前要计算的数,count专门负责统计次数,避免变量复用导致的逻辑混乱。 - 修正循环条件:
while (current != 0)确保只要当前数还没到0,就继续执行除法操作。 - 正确的计数逻辑:每次完成
current = current / 2后,将count加1,完全对应你例子里的每一步除法操作。 - 健壮性优化:新增了输入异常捕获,以及关闭Scanner资源的操作,让代码更严谨。
测试输入40的场景:
- current初始=40 → 除以2得20,count=1
- current=20 → 10,count=2
- current=10 →5,count=3
- current=5→2,count=4
- current=2→1,count=5
- current=1→0,count=6
- 此时current为0,循环结束,输出结果6,完全符合你的预期。
内容的提问来源于stack exchange,提问作者ahto design
相关产品推荐
相关产品推荐

