如何添加n个奇数整数?

时间:2019-02-11 18:47:57

标签: java loops

我正在尝试编写一个程序,该程序计算前n个正整数的和。

我在弄清楚如何将n合并到求和中时遇到麻烦。我已经有一个do / while循环来确保分配n值时得到正值。我知道我必须使用for循环,但是我不确定如何做到这一点。

Scanner input = new Scanner(System.in); // open input stream
    String cleanUpStr;                      // clean kbd buffer
    int n;                                  // number
    int sum;                                // sum of numbers
    int cntr;                               // counter for loop

    cleanUpStr = "nothing yet";
    n = 0;
    sum = 0;
    cntr = 0;

    //prompt user for the value of n
    // use a loop to ensure a positive output
    do
    {
        System.out.println("Enter the value of n");

        n = input.nextInt();
        cleanUpStr = input.nextLine();

        // print error if n is invalid
        if (n < 0)
        {
            System.out.println("Invalid n value of " + n + ", try again.");
        } // end if

    }while(n < 0);

    for(cntr = 0; cntr < n; ++cntr)
    {


    } // end for




} // end main

例如:如果n = 5,则应计算1 + 3 + 5 + 7 + 9。

5 个答案:

答案 0 :(得分:6)

这个问题的好处是,您不需要编写循环!前n个正整数的和是n的平方(在整个文章中写为n ^ 2)。这就是您用n表示总和的方式。因此,满足以下条件即可:

// Calculate the sum of first n positive odd integers by using the n^2 formula.
public static int sumOddIntegers(int n) {
    return n*n;
}

如果您设置使用循环,则可以观察到第i个正整数可以使用公式(2i-1)计算得出:

// Calculate the sum of first n positive odd integers by adding each number iteratively in a loop.
public static int sumOddIntegers(int n) {
    int oddSum = 0;
    for (int i = 1; i <= n; i++) {
        oddSum += (2*i - 1);
    }
    return oddSum;
}

要对此进行可视化,请考虑以下示例:

n = 1 List: {1} S(n) = 1 = 1 = n^2
n = 2 List: {1, 3} S(n) = 1 + 3 = 4 = n^2
n = 3 List: {1, 3, 5} S(n) = 1 + 3 + 5 = 9 = n^2
n = 4 List: {1, 3, 5, 7} S(n) = 1 + 3 + 5 + 7 = 16 = n^2
n = 5 List: {1, 3, 5, 7, 9} S(n) = 1 + 3 + 5 + 7 + 9 = 25 = n^2
And so on...

这是一种归纳证明,表明前n个正奇数之和为n ^ 2。我是Stack Overflow的新手,所以我希望格式清晰易读。如果可以改善,请随时提出建议:)似乎Stack Overflow不支持LaTeX样式指数和下标格式,因此我已尽力而为。

证明

P(n):前n个正整数的和为n ^ 2。

基本案例

P(1):n = 1

n = 1的情况微不足道。前n个正奇整数的列表仅是{1}。因此,前n个正整数的和为1。由于1 = n = n ^ 2,所以谓词P(1)成立。

归纳假设

假定对于任意正整数k> 0,P(k)都成立。

归纳步骤

给出P(k),我们将证明P(k + 1)也成立。换句话说,如果前k个正奇整数的和为k ^ 2,则前(k + 1)个正奇整数的和为(k + 1)^ 2。

作为证明的一部分,假设以下引理。

引理1:第n个正整数可以表示为2n-1。

如果P(k)成立,那么前k个正整数{a_1,... a_k}的总和为k ^ 2,其中元素a_k表示为2k-1(由引理1表示)。因此,将第(k + 1)个正奇数整数a_(k + 1)加到前k个正奇数整数的列表中,将产生第一个(k + 1)个正奇数整数的列表,如下所示: a_1,... a_k,a_(k + 1)}。因此,前(k + 1)个正整数的列表的总和等于前k个正整数的列表的总和加上a_(k + 1)的值,即(k + 1 )st正整数。根据引理1,第(k + 1)个正奇整数表示为2(k + 1)-1 = 2k + 1。

让S(k)=前k个正整数的和。因此,S(k)= k ^ 2。以上陈述暗示

S(k+1) = S(k) + a_(k+1), adding the (k+1)st positive odd integer

S(k+1) = S(k) + (2(k+1)-1), by Lemma 1 

S(k+1) = S(k) + (2k+1)  

S(k+1) = k^2 + (2k+1), by inductive hypothesis

S(k+1) = k^2 + 2k + 1

S(k+1) = (k+1)^2, by factoring

因此,我们证明了如果S(k)= k ^ 2,则S(k + 1)=(k + 1)^ 2。这表明P(k)-> P(k + 1)。

通过归纳,我们证明了对于任何正整数n> 0,P(n)都成立。 因此,前n个正奇整数的总和为n ^ 2。 QED。

引理1的证明:

这是归纳法的证明。

P(n):第n个正奇整数a_n可以表示为2n-1。

基本情况:P(1):1是第一个正整数(情况n = 1)。

1 = 2(1)-1 = 1. 

Therefore, a_1 = 1 = 2n-1. Correct.

归纳假设:假设P(k)成立。

归纳步骤:如果P(k)成立,那么P(k + 1)成立。

如果P(k)成立,则第k个正奇数整数可以表示为2k-1。此外,下一个正整数(第(k + 1)个正整数)将为(2k-1)+2。

= (2k-1) + 2
= 2k-1 + 2
= 2k+2 - 1
= 2(k+1) -1

我们证明了P(k)-> P(k + 1)。因此,通过归纳,P(n)对于所有n> 0的整数均成立。QED。

祝你好运!希望这会有所帮助:)

答案 1 :(得分:5)

Stream很好,但是如果您是初学者,那么最好的老for循环是您最好的朋友。

public static int sumForOddNumbers(int total) {
    int sum = 0;

    for(int i = 0, odd = 1; i < total; i++, odd += 2) {
        sum += odd;
    }

    return sum;
}

答案 2 :(得分:4)

Java流API提出了非常清晰的解决方案:

fork

有关linkIntStream.iterate(1, i -> i + 2) .limit(n) .sum(); 的更多信息

答案 3 :(得分:2)

尽管如果您关注函数式编程,那么流将是解决此问题的好方法,但是只要学习Java,我将建议如下。

int oddValue = 1; 
int answer = 0;  
for(cntr = 0; cntr < n; ++cntr)
    {
        //adds oddvalue to your answer
        answer += oddValue;
        //adds two to odd value (next odd)
        oddValue+=2;

    }

答案 4 :(得分:1)

有很多解决此问题的方法。

您正在考虑的方式是,可以使用循环。通常,您有一个循环计数器和一些最大值。

首先要进行的观察是,奇数以2k-1的形式写入。例如k = 3,2 * 3 - 1 = 5,即5是第三个奇数。

鉴于此,您可以为k编写一个循环,如下所示:

for (int k = 1; k <= n; k++) {
  int oddNumber = 2 * k - 1; // the kth odd number
}

然后可以将其汇总。

另一种实现方法是@Ruslan显示的方法,该方法使用lambda表达式对相似的想法进行编码。它遍历整数列表,每次从1开始到2步进:1, 3, 5, 7, ...。这也可以循环执行:

for (int oddNumber = 1; oddNumber <= (2*n - 1); oddNumber += 2) {
   // calculate a sum here
}

请注意,此2*n - 1表达式再次出现。我们一直在计数奇数,直到达到第n个。

还有一些不循环的方法,例如实现以下模式:

1 = 1
1 + 3 = 4
1 + 3 + 5 = 9
1 + 3 + 5 + 7 = 16
1 + 3 + 5 + 7 + 9 = 25

这意味着前n个奇数之和仅为n^2。无需循环。 (有关证明,请访问您喜欢的数学网站。)