本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
本来想用10000大小的数组分别储存各项分子和分母,但是对于较大N的情况无法通过
#include<stdio.h>
int main()
{
int a[10000] = {2}; // 储存分子
int b[10000] = {1}; // 储存分母
int N;
double sum = 2.0;
int i;
scanf("%d", &N);
for( i=1 ; i<N ; i++ ){
a[i] = a[i-1] + b[i-1];
b[i] = a[i-1];
sum += 1.0*a[i]/b[i];
}
printf("%.2f", sum);
return 0;
}
事实上用int类型已经无法通过这个测试点
#include<stdio.h>
// 同样无法通过
int main()
{
int a = 2; // 储存分子
int b = 1; // 储存分母
int t = a; // 用于每次计算时储存前一项分子
int N;
double sum = 2.0;
int i;
scanf("%d", &N);
for( i=1 ; i<N ; i++ ){
t = a; // 储存前项分子
a = t + b; // 第i项分子
b = t; // 第i项分母
sum += 1.0*a/b;
}
printf("%.2f", sum);
return 0;
}
修改一部分数据类型为double后通过
#include<stdio.h>
int main()
{
double a = 2.0; // 储存分子
double b = 1; // 储存分母
double t = a; // 用于每次计算时储存前一项分子
int N;
double sum = 2.0;
int i;
scanf("%d", &N);
for( i=1 ; i<N ; i++ ){
t = a; // 储存前项分子
a = t + b; // 第i项分子
b = t; // 第i项分母
sum += a/b;
}
printf("%.2f", sum);
return 0;
}