按周递增单日储蓄额的总金额计算Java代码优化问题
解决方案
实现思路
原代码仅对前两周做了硬编码判断,要适配任意天数,只需将单日存款额的计算逻辑通用化:
- 任意一天的存款额等于当前所在周数,第1周(第1-7天)存1美元,第2周(第8-14天)存2美元,以此类推
- 总储蓄可通过两种方式计算:循环累加每日存款额,或用数学公式直接计算,两种方式均支持任意天数输入
优化后代码(循环版,逻辑简单易懂)
import java.util.Scanner; public class App { public static void main(String[] args) throws Exception { int days; int savings = 0; Scanner input = new Scanner(System.in); System.out.print("Enter the number of days: "); days = input.nextInt(); input.close(); for(int i = 0; i < days; i++){ // 自动计算当日存款额,无需硬编码周数范围 int dailySave = (i / 7) + 1; savings += dailySave; } System.out.println("Total Frank's savings (after " + days +" days): " + savings); } }
优化后代码(公式版,性能更高)
如果输入天数量级很大,公式法可实现O(1)时间复杂度计算,无需循环遍历:
import java.util.Scanner; public class App { public static void main(String[] args) throws Exception { int days; Scanner input = new Scanner(System.in); System.out.print("Enter the number of days: "); days = input.nextInt(); input.close(); int fullWeeks = days / 7; int remainDays = days % 7; // 整周部分总储蓄:7*(1+2+...+fullWeeks) = 7*fullWeeks*(fullWeeks+1)/2 int fullWeekSavings = 7 * fullWeeks * (fullWeeks + 1) / 2; // 剩余不足一周部分的总储蓄 int remainSavings = remainDays * (fullWeeks + 1); int totalSavings = fullWeekSavings + remainSavings; System.out.println("Total Frank's savings (after " + days +" days): " + totalSavings); } }
验证结果
以示例的16天为例:
- 完整周数为2,整周总储蓄为723/2=21美元
- 剩余天数为2,剩余部分储蓄为2*3=6美元
- 总储蓄为27美元,和示例结果完全一致
内容的提问来源于stack exchange,提问作者Rivf
相关产品推荐
相关产品推荐

