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

Java for循环计算首数字后整数平均值始终输出0如何解决

问题原因

你的代码始终输出0,核心问题和隐藏逻辑错误如下:

  • 最致命的问题是外层for循环逻辑完全失效:你定义的循环初始值i = j(j为当前行字符串长度-1),循环判断条件是i < j,条件从初始化开始就不成立,整个循环体一次都不会执行,sum始终是初始化的0,最终输出自然为0。
  • 其余隐藏逻辑错误:
    • 求和范围错误:原本的求和逻辑从数组索引0开始累加,会把代表数字个数的第一个数字也算进总和,不符合需求
    • 整数除法精度丢失:两个int类型运算结果仍为int,会直接截断小数部分,就算求和正确也无法得到2.0这类带小数的平均值
    • 重复冗余计算:把字符串拆分、转整数数组的逻辑放在循环内部,就算循环能执行也会重复做无意义的运算
    • 平均值计算位置错误:把除法运算放在循环内部,若循环多次执行会重复做除法,结果完全错误
    • 输出截取逻辑硬编码:用st.substring(2)截取后续数字的写法,遇到第一个数是两位及以上的情况(比如第一行是10 1 2 ...)会截取错误
修正后可运行代码
public static void main(String[] args) throws IOException {
    File num = new File("numbers.txt");
    // 自动关闭流,避免资源泄漏
    try (BufferedReader br = new BufferedReader(new FileReader(num))) {
        String line;
        while ((line = br.readLine()) != null) {
            // 每行仅做一次拆分、类型转换
            String[] segments = line.trim().split(" ");
            int[] values = Stream.of(segments)
                    .mapToInt(Integer::parseInt)
                    .toArray();
            int count = values[0];
            int sum = 0;
            // 从索引1开始累加,跳过第一个计数位
            for (int i = 1; i < values.length; i++) {
                sum += values[i];
            }
            // 强转成double做除法,保留小数位
            double average = (double) sum / count;
            
            // 输出结果,避免硬编码截取字符串的问题
            StringBuilder numStr = new StringBuilder();
            for (int i = 1; i < values.length; i++) {
                numStr.append(values[i]).append(" ");
            }
            System.out.printf("The average of the %d integers %s the average is %.1f%n",
                    count, numStr.toString().trim(), average);
        }
    }
}
效果验证

针对你给出的测试用例行3 1 2 3:

  • 读取到count=3,累加索引1到3的数值:1+2+3=6
  • 浮点除法计算6/3=2.0,输出结果和预期完全一致

内容的提问来源于stack exchange,提问作者mislepone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:15:56