为了账号安全,请及时绑定邮箱和手机立即绑定

如何添加“n”个奇数?

如何添加“n”个奇数?

红颜莎娜 2022-06-15 15:37:06
我正在尝试编写一个程序来计算前 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。
查看完整描述

4 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

这个问题的好处是您不需要编写循环!前 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;

}

如果您打算使用循环,则可以通过观察可以使用公式 (2i-1) 计算第 i 个正奇数整数来执行以下操作:


// 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) 成立。


归纳假设

假设 P(k) 对任意正整数 k > 0 成立。


感应步骤

给定 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。


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


查看完整回答
反对 回复 2022-06-15
?
慕运维8079593

TA贡献1876条经验 获得超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;

}


查看完整回答
反对 回复 2022-06-15
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

Java 流 API 提出了非常明确的解决方案:

IntStream.iterate(1, i -> i + 2)
     .limit(n)
     .sum();

IntStream通过链接了解更多信息


查看完整回答
反对 回复 2022-06-15
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

虽然如果您关心函数式编程,流将是解决此问题的好方法,但仅学习 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;


    }



查看完整回答
反对 回复 2022-06-15
  • 4 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信