我正在尝试编写一个计算前n个正奇数整数之和的程序.
我无法弄清楚如何将n合并到求和中.我已经有一个do/while循环来确保在赋值时得到正值.我知道我必须使用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
Run Code Online (Sandbox Code Playgroud)
例如:如果n = 5,则应计算1 + 3 + 5 + 7 + 9.
关于这个问题的好处是,你不需要写一个循环!前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;
}
Run Code Online (Sandbox Code Playgroud)
如果您已设置使用循环,则可以通过观察可以使用公式(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;
}
Run Code Online (Sandbox Code Playgroud)
要想象这一点,请考虑以下示例:
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...
Run Code Online (Sandbox Code Playgroud)
这是通过感应证明前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)st个正奇数整数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)st个正奇数整数表示为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
Run Code Online (Sandbox Code Playgroud)
因此,我们已经表明,如果S(k)= k ^ 2,那么S(k + 1)=(k + 1)^ 2.这表明P(k) - > P(k + 1).
通过归纳,我们已经证明P(n)适用于任何正整数n> 0.因此,前n个正奇数整数之和为n ^ 2.QED.
这是通过归纳证明的.
P(n):第n个正奇数整数a_n可以表示为2n-1.
基本情况:P(1):1是第一个正奇整数(情况n = 1).
1 = 2(1)-1 = 1.
Therefore, a_1 = 1 = 2n-1. Correct.
Run Code Online (Sandbox Code Playgroud)
归纳假设:假设P(k)成立.
归纳步骤:如果P(k)成立,则P(k + 1)成立.
如果P(k)成立,则第k个正奇整数可以表示为2k-1.另外,下一个正奇数整数((k + 1)st个正奇数)将是(2k-1)+ 2.
= (2k-1) + 2
= 2k-1 + 2
= 2k+2 - 1
= 2(k+1) -1
Run Code Online (Sandbox Code Playgroud)
我们已经证明P(k) - > P(k + 1).因此,通过归纳,P(n)适用于所有整数n> 0.QED.
祝好运!希望这有用:)
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |