Java循环首次执行后不再运行:第二次迭代失效问题排查
循环只执行一次?问题出在变量冲突!
嘿,我一眼就揪出问题所在了——你外层循环和内层循环用了同一个计数器变量i,这直接把循环逻辑搞崩啦!
问题详细分析
咱们一步步拆解:
- 外层循环初始化
i=0,当i < t(这里输入的t=2)时进入循环 - 第一次进入外层循环后,内层循环又把
i重置为0,接着执行n次迭代 - 内层循环跑完后,
i的值会变成n(比如第一个测试用例n=10,跑完后i就变成10了) - 这时候回到外层循环的条件判断
i < t(10 < 2?显然不成立),所以外层循环直接终止,根本不会执行第二次迭代
另外还有个隐藏小坑:你的sum变量是在所有循环外面初始化的,就算循环能跑第二次,sum也会累积第一次的结果,导致第二个测试用例的输出完全错误。
修正后的代码
把内层循环的变量换成别的(比如j),同时把sum移到外层循环内部,每次处理新的测试用例时重新初始化:
class Solution { public static void main(String[] argh) { Scanner in = new Scanner(System.in); int t = in.nextInt(); for (int i = 0; i < t; i++) { int sum = 0; // 每个测试用例重新初始化sum,避免结果累积 int a = in.nextInt(); int b = in.nextInt(); int n = in.nextInt(); // 内层循环用j当计数器,彻底避免和外层的i冲突 for (int j = 0; j < n; j++) { sum += (a + (Math.pow(2, j) * b)); System.out.print(sum + " "); } } in.close(); } }
更优化的小建议
Math.pow返回的是double类型,强制转int可能会有潜在精度风险(虽然这里2的幂次没问题,但养成好习惯很重要),可以用整数变量来维护幂次,效率更高也更安全:
class Solution { public static void main(String[] argh) { Scanner in = new Scanner(System.in); int t = in.nextInt(); for (int i = 0; i < t; i++) { int sum = 0; int a = in.nextInt(); int b = in.nextInt(); int n = in.nextInt(); int currentPow = 1; // 初始为2^0=1 for (int j = 0; j < n; j++) { sum += (a + currentPow * b); System.out.print(sum + " "); currentPow *= 2; // 每次乘2,得到下一个2的幂次 } } in.close(); } }
现在运行你的输入2 0 2 10 5 3 5,就能得到完全符合预期的输出啦:
2 6 14 30 62 126 254 510 1022 2046 8 14 26 50 98
内容的提问来源于stack exchange,提问作者Bhavishya Bharara
相关产品推荐
相关产品推荐

