【题目描述】

有一个分数序列,$ 2 \over 1 $, $ 3 \over 2 $, $ 5 \over 3 $, $ 8 \over 5 $, $ 13 \over 8 $, 求出这个序列的前n项和,结果保留两位小数。(注意,不用通分,单项相加即可)

【输入描述】

一个数字,N

【输出描述】

前N项的和

【样例输入】

10

【样例输出】

16.48

【题目分析】

(1)第一眼看上去像斐波那契数列数列,但是不完全是,数列之间有一定的规律
(2)每个分数的分子是上一个分式分子分母的和(规律1)
(3)递归和循环都能解决这个问题
(4)横向来看,斐波那契数列,可以对分子分母分别使用(规律2)


【参考代码1】

采用循环的方式解决

#include<cstdio>
int main()
{
	int N;
	int i;
	double t,num,sum=0;
	double a=1,b=2;
	scanf("%d",&N); //读入n 
	for(i=1;i<=N;i++) // 
	{
		 num=b/a; //当前分式的结果 
		 sum=sum+num; //累加过程 
		 t=b;  
		 b=a+b;  //下一次分式的分子等于上一次的分子加分母的和 
		 a=t;  
	}
printf("%.2f\n",sum); 
	return 0;
}

【参考代码2】

采用递推的方式解决,按照要求,先把整个数列构造出来,然后再单独相加。

#include<cstdio>
#include<iostream>
using namespace std; 

double a[100],b[100]; //定义分子和分母的数组  
double sum; //定义和 
int main()
{
	a[1]=2,a[2]=3;  //定义分子的初值 
	b[1]=1,b[2]=2;  //定义分母的初值 
	int n;  //定义n的范围
	cin>>n; 
	for(int i=3;i<=n;i++)
	{
		a[i]=a[i-1]+a[i-2];
		b[i]=b[i-1]+b[i-2]; //对分子分母分别使用递推式 
	}
	for(int i=1;i<=n;i++)
		sum+=a[i]/b[i];
	printf("%.2f",sum);
	return 0; 
}

返回目录:题解目录