修改Java循环代码实现交替符号数列求和(1–1/2+1/3–…+1/N)
重构Java代码实现交替符号求和
没问题,我来帮你调整这段代码,实现1 – 1/2 + 1/3 – 1/4 + … + 1/N的交替级数求和逻辑。先拆解下原代码的问题:原来的循环里每次都是累加-(1.0/i),相当于所有项都是负数,完全不符合交替符号的需求,我们需要修改符号的控制逻辑。
修改后的完整代码
import java.util.Scanner; public class AlternatingSumCalculator { public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.print("Enter an integer: "); int n = keyboard.nextInt(); double total = 0.0; // 用符号变量控制当前项的正负,初始为正(对应第一项1/1) int currentSign = 1; for (int i = 1; i <= n; i++) { // 累加当前项:符号 × 分数值 total += currentSign * (1.0 / i); // 翻转符号,为下一项做准备 currentSign *= -1; } // 格式化输出结果,保留4位小数更清晰 System.out.printf("The total is: %.4f", total); keyboard.close(); // 关闭输入流,避免资源泄漏 } }
关键改动说明
- 符号控制:新增
currentSign变量,初始值为1(对应第一项的正号),每次循环后乘以-1实现正负交替,这是最高效的符号切换方式。 - 可读性优化:把变量名
x改成total,语义更明确,别人读代码时一眼就能懂它的用途。 - 输出格式化:用
printf代替print,可以指定小数位数,避免输出一堆无意义的小数位(比如输入5时,输出0.7833比0.7833333333333333友好得多)。 - 资源管理:添加
keyboard.close(),养成良好的IO资源使用习惯。
另一种直观实现方式(适合新手理解)
如果你觉得符号变量的方式有点绕,也可以直接根据i的奇偶性判断符号,代码更直白:
for (int i = 1; i <= n; i++) { if (i % 2 == 1) { // 奇数项加分数 total += 1.0 / i; } else { // 偶数项减分数 total -= 1.0 / i; } }
这种方式的缺点是每次循环都要做一次取余判断,效率略低,但胜在逻辑直观,容易理解。
示例运行
当输入整数5时,计算过程为:
1 - 1/2 + 1/3 - 1/4 + 1/5 = 1 - 0.5 + 0.3333 - 0.25 + 0.2 = 0.7833
程序会输出:The total is: 0.7833
注意事项
一定要用1.0/i而不是1/i!因为1和i都是整数,1/i会触发整数除法(比如1/2的结果是0而不是0.5),直接导致计算结果完全错误。用1.0(浮点数)和i运算时,i会自动转成浮点数,才能得到正确的分数值。
内容的提问来源于stack exchange,提问作者Cassie Robar
相关产品推荐
相关产品推荐

