Java幂次序列练习题输出看似一致却测试失败求助
排查:输出序列测试未通过的深层原因
嘿,我太懂这种明明输出看起来和预期一模一样,但判题系统就是不给过的挫败感了!你的代码逻辑没问题,但有两个容易被忽略的细节导致了测试失败:
1. 输出末尾的多余空格
你代码里每次循环都执行 System.out.print(num + " "),这会让每一行的最后一个数字后面多出来一个空格。绝大多数在线判题系统对格式要求极其严格——哪怕多一个空格、少一个换行,都会直接判定为错误。比如预期输出是 2 6 14 ... 2046,而你的实际输出是 2 6 14 ... 2046 (末尾带空格),这就是典型的格式不匹配问题。
2. Math.pow 的精度与溢出隐患
Math.pow(2, j) 返回的是 double 类型,虽然在你的测试用例里(j最大到9)转换为int不会出问题,但这个写法本身就有隐患:
- 当j增大到31时,
2^31是2147483648,已经超过了int的最大值(2147483647),强制转换会直接溢出变成负数; - 对于更大的j,
double无法精确表示所有整数,会出现精度丢失的情况,导致计算结果错误。
修复方案(同时解决两个问题)
这里给你两种靠谱的修复思路,都能完美适配题目要求:
方案一:递推计算 + 用StringBuilder处理输出
用递推的方式计算2的幂次,避免浮点运算,同时用StringBuilder来拼接输出,精准控制空格:
import java.util.Scanner; class Playground { public static void main(String[] args) { Scanner in = new Scanner(System.in); int q = in.nextInt(); for (int i = 0; i < q; i++) { int a = in.nextInt(); int b = in.nextInt(); int n = in.nextInt(); int currentVal = a; StringBuilder output = new StringBuilder(); int powerOfTwo = 1; // 初始为2^0 for (int j = 0; j < n; j++) { currentVal += powerOfTwo * b; output.append(currentVal); // 只有不是最后一项时才加空格 if (j != n - 1) { output.append(" "); } powerOfTwo *= 2; // 递推得到下一个2的幂次 } System.out.println(output.toString()); } } }
方案二:利用数学公式简化计算
观察序列的规律,第j项(从0开始计数)可以直接用公式计算:
第j项 =
a + b*(2^(j+1) - 1)
因为2^0 + 2^1 + ... + 2^j的和是2^(j+1)-1,用这个公式可以直接算出每一项,同时用位运算替代Math.pow,更高效可靠:
import java.util.Scanner; class Playground { public static void main(String[] args) { Scanner in = new Scanner(System.in); int q = in.nextInt(); for (int i = 0; i < q; i++) { int a = in.nextInt(); int b = in.nextInt(); int n = in.nextInt(); StringBuilder output = new StringBuilder(); for (int j = 0; j < n; j++) { // 用位运算计算2^(j+1),比Math.pow更安全 int term = a + b * ((1 << (j + 1)) - 1); output.append(term); if (j != n - 1) { output.append(" "); } } System.out.println(output.toString()); } } }
⚠️ 注意:如果题目中n的取值范围很大(比如j+1超过30),可以把变量改成long类型,避免int溢出。
验证效果
修复后的代码对你给出的测试用例,会输出完全符合格式要求的结果:
2 6 14 30 62 126 254 510 1022 2046 8 14 26 50 98
没有多余空格,计算结果也完全准确,应该能顺利通过测试了。
内容的提问来源于stack exchange,提问作者Llinwey
相关产品推荐
相关产品推荐

