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

LeetCode 1716题Java代码等差数列求和逻辑错误排查求助

问题排查:等差数列求和函数weekCalc计算错误

问题背景

Hercy为购买第一辆车存钱,他每天向LeetCode银行存钱:周一第一天存1美元,周二到周日每天比前一天多存1美元,后续每个周一比前一个周一多存1美元。给定n,返回第n天结束时的总存款。

问题描述

尝试用等差数列(AP)求和思路解决LeetCode 1716题,但weekCalc函数存在计算错误:调用weekCalc(1,5)时,预期输出15,实际得到12。需要排查该函数的问题原因。

错误原因分析

weekCalc函数存在两个核心问题:

  1. 公式运算顺序错误:正确的等差数列求和公式是总和 = n * (2*首项 + (n-1)*公差) / 2(公差为1时可简化为n*(2a +n-1)/2),你写的(n/2)*(2*a +n-1)会先执行整数除法。
  2. 整数截断问题:当n为奇数时(比如n=5),Java中n/2会直接截断小数部分,5/2得到2,代入计算后结果为2*(2*1+5-1)=12,和正确结果15产生偏差。

修复后的代码

public class Practice {
    public static int weekCalc (int a , int n){
        // a - 每周起始存款金额 
        //n - 天数 
        int c = n * (2*a + n - 1) / 2;
        return c;
    }

    public static int total (int n ){
        int sum = 0;
        if (n<=7){
            sum +=  weekCalc(1, n); 
        } else {
            int num = n/7;
            for (int i =1 ; i<= num; i++){
                sum +=  weekCalc(i, 7);
            }
            int d = n%7;
            sum += weekCalc(num +1, d);
        }
        return sum ;

    }
    public static void main (String args[]){
       int ans = total(5);
       System.out.println(ans); // 现在输出正确的15
    }
}

额外优化建议

你可以将total方法中的循环替换为等差数列求和公式,避免循环提升效率:
完整num周的存款总和本身也是一个等差数列:第一周总和28,第二周35,公差为7。用公式num * (2*28 + (num-1)*7) / 2即可直接计算出完整周的总和,无需循环累加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:02:16