如何实现计算指定范围内可被除数整除数字之和的Java方法?
如何正确实现sumDivisible方法
先说说你现有代码的问题:
- 你定义的
sum方法完全没实现累加逻辑,只是返回单个符合条件的数字,导致每次找到能被整除的数时,只会输出这个数本身,而不是所有符合条件数的总和。 - 方法参数设计不合理,
sum不需要传入from、div、to这些参数,也不需要把循环变量i传进去。 - 循环里的打印逻辑错误,你应该在循环结束后打印最终的总和,而不是每次找到符合条件的数就打印一次。
正确的实现思路
要完成sumDivisible方法,只需要以下几步:
- 初始化一个变量用来存储累加的总和,初始值为0。
- 遍历
[from, to]范围内的每一个数字。 - 对每个数字判断是否能被
divisor整除(用i % divisor == 0判断,余数为0表示可以整除)。 - 如果符合条件,就把这个数字加到总和变量里。
- 遍历结束后,返回总和变量。
完整的修正代码
public class Main { public static void main(String[] args) { System.out.println("Example: divisor: 2, from: 2, to: 6"); int from = 2; int to = 6; int divisor = 2; // 调用sumDivisible方法并打印结果 int result = sumDivisible(from, to, divisor); System.out.println("Result: " + result); // 输出12 } // 按照题目要求实现的方法 public static int sumDivisible(int from, int to, int divisor) { int total = 0; // 遍历[from, to]的所有数字 for (int i = from; i <= to; i++) { // 判断当前数字是否能被divisor整除 if (i % divisor == 0) { total += i; // 累加符合条件的数字 } } return total; // 返回总和 } }
额外优化(可选)
如果范围很大,循环遍历效率不高,可以用数学公式直接计算:
- 找到范围内第一个能被
divisor整除的数:first = ((from + divisor - 1) / divisor) * divisor,如果这个数大于to,说明没有符合条件的数,返回0。 - 找到范围内最后一个能被
divisor整除的数:last = (to / divisor) * divisor。 - 符合条件的数是一个等差数列,项数
count = (last - first) / divisor + 1。 - 总和就是
(first + last) * count / 2。
对应的优化代码:
public static int sumDivisible(int from, int to, int divisor) { if (divisor == 0) { throw new IllegalArgumentException("Divisor cannot be zero"); } int first = ((from + divisor - 1) / divisor) * divisor; if (first > to) { return 0; } int last = (to / divisor) * divisor; int count = (last - first) / divisor + 1; return (first + last) * count / 2; }
内容的提问来源于stack exchange,提问作者Matvei Johns
相关产品推荐
相关产品推荐

