问题:编写一个方法,将两个整数n和m作为参数,并将数字(数字数组)的总和从n(包括n)返回到m(包括m)。
public int getSum(int n, int m){
this.n = n;
this.m = m;
int [] x = {n,m};
int result = 0;
for(int i=0; i<x.length; i++){
result += x[i];
}
return result;
}
如果n = 1且m = 4,则该方法返回5,但该方法需要返回10,(1,2,3,4)=(1 + 2 + 3 + 4)。 猜猜这条线是不对的 int [] x = {n,m}; 因为如果n = 1且m = 4,则阵列将为{1,4}。如何解决这个问题,如果n = 1且m = 4
,则需要创建数组{1,2,3,4}答案 0 :(得分:4)
试试这个:
public int getSum(int n, int m){
int result = 0;
for(int i = n;i <= m;i++)
result += i;
return result;
}
或者这个:
public int getSum(int n, int m){
int result = 0;
while(n <= m)
result += n++;
return result;
}
或者也许有趣的数学:
public int getSum(int n, int m){
return (m*(m+1)/2) - ((n-1)*((n-1)+1)/2)
}
F(n) = (n*(n+1)/2) = 0+1+2+...+n
F(m) - F(n-1) = n + n+1 + n+2 + ... + m
答案 1 :(得分:1)
Java 8
return IntStream.rangeClosed(n, m).sum();
答案 2 :(得分:1)
您的代码存在许多问题。
但是,中心问题就是这条线。 int [] x = {n,m};
该行的作用是创建一个只有2个数字的数组,当你遍历那个数组时,你只是添加这两个数字,而不是两者之间的所有数字。
在C,C ++,Java等语言中......迭代一系列数字的最简单的习惯用法是
for(int i = n, i <=m, i++){
...
}
这样做,创建一个临时变量i
并将其初始化为n
范围内的第一个数字。然后在循环中运行,每次将临时数i
递增1,直到它超过范围m
的最后一个数字。
在循环体内,对于循环的迭代,现在可以使用范围的每个数字。
因此,在您汇总所有数字的情况下,您可以通过设置如下的累加器变量来累积范围内的所有数字。
int acc = 0;
for(int i = n, i <=m, i++){
acc = acc + i;
}
答案 3 :(得分:0)
你不能这样做:
public static int getSum(final int n, final int m) {
// default value
int sum = 0;
// not permitted
if (n >= m)
return 0;
// all of the work here
for (int i = n; i <= m; i++)
sum += i;
return sum;
}