(1)求序数的前n项和, 输出一个正整数n,输出2/1+3/2+5/3+8/5…的前n项和(每一项的分子是前一项的分子和分母之和,分母是前一项的分子),保留两个小数输出.
解:
假设分子为 a =A(n), 分母为b=B(n), 第n项的值:F(n)=A(n)/B(n);
那么:
前n项的值: sum(n) = 2/1 +3/2+5/3+8/5……..A(n-1)/B(n-1)+A(n)/B(n).
然后可以变形:(就是加1,再减1),作为第0项
sum(n) = 1/1+2/1 +3/2+5/3+8/5……..A(n-1)/B(n-1)+A(n)/B(n) -1
我们分析每一项的关系:
项数 | A | B |
---|---|---|
0 | 1 | 1 |
1 | 2 | 1 |
2 | 3 | 2 |
2 | 5 | 3 |
2 | 8 | 5 |
….. | ||
n-2 | A(n-2) | B(n-2) |
n-1 | A(n-1) | B(n-1) |
n | A(n) | B(n) |
这里我们很容易猜测出:
A(n)=A(n-1)+A(n-2)
B(n)=B(n-1)+(n-2)
真的吗?我们做推论.
根据:每一项的分子是前一项的分子和分母之和,分母是前一项的分子
那么:在n>2的时候:
A(n) = A(n-1)+B(n-1)
B(n) =A(n-1) =A(n-2)+A(n-3)=B(n-1)+B(n-2);
—> A(n) = A(n-1) +A(n-2);
—> B(n) =B(n-1)+B(n-2);
其实际就是斐波拉契数列
同时: A(0)=1 ,B(0)=1; A(1)=2 B(1)=1;
那么我们就可以码代码了:
#include <stdio.h>
//求第n项的B
float fB(int n)
{
if(n==0||n==1){
return 1.0;
}else{
return fB(n-1)+fB(n-2);
}
}
//A B
//1 1
//2 1
//3 2
//5 3
//8 5
//求第n项的A
float fA(int n)
{
if(n==0){
return 1.0;
}else if(n==1){
return 2.0;
}else{
return fA(n-1)+fA(n-2);
}
}
//求第n项的值
float f(int n)
{
return fA(n)/fB(n);
}
float sumbynum(int n)
{
int i =0;
float sum = 0;
for(;i<=n;i++)
{
sum+=f(i);
}
//最后,记得减一
//sum(n) = 1/1 + 2/1 +3/2+5/3+8/5........A(n-1)/B(n-1)+A(n)/B(n) -1
sum--;
return sum;
}
int main(int argc, const char * argv[]) {
int n =20;//这里是输入的项数
printf("%f\n",sumbynum(n));
return 0;
}