在这个问题上,给我们一个数字n。我们的任务是创建一个程序来查找级数1 +(1 + 3)+(1 + 3 + 5)+(1 + 3 + 5 + 7)+……+(1 + 3 + 5 + 7 +…+(2n-1))。
让我们举个例子来了解这个问题,
输入: n = 5
输出: 55
因此,根据这个问题,假设用户给我们一个数字“ n”,我们必须添加序列1 +(1 + 3)+(1 + 3 + 5)+(1 + 3 + 5 + 7)+…… +(1 + 3 + 5 + 7 +…+(2n-1))。
首先让我们更好地了解本系列的含义。
我们取n = 1,则级数变为1。
我们取n = 2,则级数变为1+(1 + 3),因为最后一项2n-1的值可以计算为2乘以2超过1,即3。
n的值 | 2n-1 | 系列变成 |
1 | 1 | 1 |
2个 | 3 | 1+(1 + 3) |
3 | 5 | 1+(1 + 3)+(1 + 3 + 5) |
4 | 7 | 1+(1 + 3)+(1 + 3 + 5)+(1 + 3 + 5 + 7) |
解决问题的方法有两种。一种数学方法是可以得到总和的表达式,因此不需要循环。另一个将是在代码中应用两个循环。
使用循环的直接方法
可以看出,级数1 +(1 + 3)+(1 + 3 + 5)+(1 + 3 + 5 + 7)+……+(1 + 3 + 5 + 7 +… +(2n-1))本身就是一个数列。因此,我们将使用嵌套循环。外循环将计算第二项。而内部循环将用于计算术语本身。
#include<stdio.h> int calcSum(int n){ int sum = 0; for (int i = 1; i <= n; i++) { // 项的第一个值始终为1 int value = 1; for (int j = 1; j <= i; j++) { sum += value; // 下学期 value += 2; } } return sum; } int main(){ int n = 35; printf("The sum of the series upto %d is %d ", n , calcSum(n)); }输出结果
The sum of the series upto 35 is 14910
该程序的工作:
用户输入n的值。假设2。
声明一个名为“ sum”的变量,其初始值为0
当i = 1时,条件i <= n为true,因此循环将起作用
变量“ ft”的值为1。
j的第一个值为1。条件为true,因为j的值等于i的值(即1)。因此j循环起作用
ft的值被加到总和上。因此,总和变成等于1的0 + 1。
ft的值被修改并增加了2,因此其新值为1 + 2 = 3
j的值增加1并变为2。
但是现在for for内部循环的条件是假的,因为j> i现在。因此,退出j循环。
现在i的值增加1并变为2,所以i = 2且条件为i <= n,因此进入循环
变量“ ft”的值再次定义为1
当j的值为1时,循环将按j <i或1 <2的方式工作。
ft的值被加到总和上。总和的值已为1。所以总和的新值是1 + 1 = 2
ft的值被修改并增加了2,因此ft的新值变为1 + 2 = 3。
j的值增加1并变为2。for循环条件成立,因为j等于i。
ft的值被加到总和上。总和的值已经是2。所以总和的新值是2 + 3 = 5
ft的值被修改并增加了2,因此ft的新值变为3 + 2 = 5。
循环存在
现在i的值增加1并变为3,所以i = 3且条件为假i <= n,因此退出循环。
在屏幕上显示消息和总和值
数学解:
通过找到问题的数学解决方案然后编写代码,将在很大程度上简化我们的代码。
令该系列的总称T n 为
在继续进行之前,我们应该知道级数1 + 3 + 5 + 7 + 9…..(2n-1)的总和为n 2, 而级数
1 2 +2 2 +3 2 +4 2 ….n 2 的总和为i 2 =
#include<stdio.h> int calcSum(int n){ // 所需金额 return (( (n) * (n + 1) * (2*n + 1 ) )/6 ) ; } int main(){ int n = 35; printf("The sum of the series upto %d is %d ", n , calcSum(n)); }输出结果
The sum of the series upto 35 is 14910
以上代码的工作方式:
例如,假设用户输入的n值为2,则2n-1的值为3,序列变为1+(1 + 3)。
但是,让我们理解并通过代码获取总和。
sum()用值2调用该函数
该函数计算as的值5并将其返回给主函数。
屏幕上将显示带有答案的消息。