数组,整数和数组之和

时间:2014-06-04 15:23:42

标签: java arrays

问题:编写一个方法,将两个整数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}

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)

@Andres已经提供了一个完美的解决方案。但是我想再解释一下,所以这里有。

您的代码存在许多问题。

但是,中心问题就是这条线。 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;
}