You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:08:19