算法小合集(求和)
例1,编写一个程序求1+2+3+4+5+…+100的值;
分析:首先这是一个等差数列可以用求和公式,但是这里不用,因为不是所有的求和我们都知道公式
既然是求和;那么必然能够写成 类似于
∑
i
=
1
n
a
i
\sum_{i=1}^{n} ai
∑i=1nai的形式
那么只要找到
a
i
ai
ai的通项公式,然后用for循环加起来就好了
所以,转换为,找通项公式
这个题目很容易看出
a
i
=
i
ai=i
ai=i;
那么代码就很容易写出来了;
#include<stdio.h>
int main()
{
int sum = 0;
for (int i = 1;i <= 100;i++)
{
sum += i;
}
printf("%d", sum);
}
例二:编写一个程序求(1)-1/2+1/3+…+1/99-1/100;
由上面的分析知道:100项循环100次
通项公式为 a i = ( − 1 ) i + 1 ∗ ( 1 / i ) ai=(-1)^{i+1} *(1/i) ai=(−1)i+1∗(1/i)
#include<stdio.h>
int main()
{
float sum = 0;
float sign = -1;
float ai;
for (float i = 1;i <= 100;i++)
{
sign *= -1;
ai = sign * (1 / i);
sum += ai;
}
printf("%f", sum);
return 0;
例三 求2+22+222+2222+…共5项
a
1
=
2
a_1=2
a1=2
a
i
+
1
=
a
i
∗
10
+
2
a_{i+1}=a_{i}*10+2
ai+1=ai∗10+2
#include<stdio.h>
int main()
{
int sum =0;
int ai=2;
for (int i = 1;i <= 5;i++)
{
if (i ==1)
{
sum += ai;
}
else
{
ai = ai * 10 + 2;
sum += ai;
}
}
printf("%d", sum);
return 0;
}
例4 编程求 1!+2!+3!+4!+…=
ai=i!
#include<stdio.h>
int fac(int n)
{
if (n == 0)
{
return 1;
}
else
{
return n * fac(n - 1);
}
}
int main()
{
int sum = 0;
int n;
scanf_s("%d", &n);
for (int i = 1;i <= n;i++)
{
sum += fac(i);
}
printf("%d", sum);
}
例五求e=1+1/1!+1/2!+1/3!+…要求最后一项小于10-10时结束
#include<stdio.h>
int fac(int n)
{
if (n == 0)
{
return 1;
}
else
{
return n * fac(n - 1);
}
}
int main()
{
double sum=0;
for (double i = 0;1.0/fac(i)>1e-10;i++)
{
sum = sum + (1.0/fac(i));
}
printf("%f",sum);
}
例6:求序列: 2 1 , 3 2 , 5 3 , 8 5 , 13 8 , 21 13 . . . \frac{2}{1},\frac{3}{2},\frac{5}{3},\frac{8}{5},\frac{13}{8},\frac{21}{13}... 12,23,35,58,813,1321...的前二十项和
分析:这个的通项公式不能一眼看出来,但是我们不难发现,
- 上一个的分子是下一个的分母
- 而下一个的分子是上一个的分子加分母
我们设分母为deno;
分子为num;
d e n o 1 = 1 , n u m 1 = 2 deno_1=1,num_1=2 deno1=1,num1=2
d e n o i = n u m i − 1 deno_i=num_{i-1} denoi=numi−1
n u m i = d e n o i − 1 + n u m i − 1 num_i=deno_{i-1}+num_{i-1} numi=denoi−1+numi−1
于是
#include<stdio.h>
int main()
{
float deno = 1, num = 2;
float sum = 0;
float ai;
float t;
for (int i = 0;i < 20;i++)
{
if (i == 0)
{
deno = 1, num = 2;
ai = num/deno;
sum += ai;
}
else
{
t = deno;//t用来存上一个deno;
deno = num;
num = t + num;
ai = num / deno;
sum += ai;
}
}
printf("%f", sum);
}
这样理解起来还是不是那么流畅,比如t的位置就容易被遗忘,于是我决定采用数组,因为数组可以随意取任何有数的地方的数,这样就完美适配了上边的公式
#include<stdio.h>
int main()
{
float deno[21];
float num[21];
deno[1] = 1;
num[1] = 2;
float ai;
float sum=0;
for (int i = 1;i < 4;i++)
{
if(i==1)
{
ai = num[i] / deno[i];
sum += ai;
}
else
{
deno[i] = num[i - 1];
num[i] = deno[i - 1] + num[i - 1];
ai = num[i] / deno[i];
sum += ai;
}
}
printf("%f", sum);
}
目前为了考试,只考虑怎么实现,不考虑时间复杂度,慢慢加油吧