繁体   English   中英

数组,整数和数组总和

[英]array, integers and sum of array

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

尝试这个:

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

Java 8

return IntStream.rangeClosed(n, m).sum();

@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;
}

你不能只是这样做:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM