我正在尝试编写一个程序,该程序计算前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。
答案 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。
这是归纳法的证明。
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)
答案 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
。无需循环。 (有关证明,请访问您喜欢的数学网站。)