C程序设计(第五版) 课后习题 5.10
第五章 循环结构
空间限制:16MB时间限制:1s总提交数:5390通过率:25.25%题目来源: C程序设计(第五版)-谭浩强
有一分数序列:2/1 3/2 5/3 8/5 13/8 21/13…求出这个数列的前N项之和,保留两位小数。注意:四舍五入!
提示:本题卡了数据,较难。题解区与评论区有提示。
输入共有T (1 <= T <= 2000) 组.
输入的第一行为一个数字T, 表示数据的组数.
输入的第2~T+1行每行一个整数N (1 <= N <= 100000), 表示要求的数列的长度.
对于每组数据, 输出数列前N项和.
5
1
3
5
10
20
2.00
5.17
8.39
16.48
32.66
题目来源 广东技术师范大学在线判题网站http://www.gpnuacm.com/#/home
#include <stdio.h>
int main()
{ long long int num[100000],getline[6666];
double sum=0.00;
long long int n,i,j;
n=0;i=0;j=0;
scanf("%lld",&n);
for(i=0;i<n;i++)
{
//这种方法是使用数组存放数值,方便判断精度不够时的输出
scanf("%lld",&getline[i]);
//初始化要求数的值
num[0]=1;num[1]=2;sum=0.00;//做过低阶版的同学可以理解为a=1;b=2;
for(j=0;j<getline[i];j++)
{
//接下来进行数值的循环,这就是低阶版的开始
//先表明如果出现越界就使用分子分母同时除以一个大数
//这样就能使精度的到保证
if(num[j]>100000000000000000)
{
num[j-1]=num[j-1]/100000;
num[j]=num[j]/100000;
num[j+1]=num[j+1]/100000;//因为调用的是三个数字受到影响,当超出临界精度时
//马上使用数组除以十万对精度进行压缩
}
if(j>0)//这样使循环可以参照于从第0项进行,j-1就是第零项
{
num[j+1]=num[j]+num[j-1];
}
sum=sum+((double)num[j+1]/num[j]); //强制性转化num变成浮点型
}
printf("%.2lf\n",sum);
}
return 0;
}
#include <stdio.h>
int main()
{ int n,i,j;
double sum,a,b,c;//这里写成float类型就会失败,亲测一百次
scanf("%d",&i);
while(i>0)
{
scanf("%d",&n);
sum=0.00;a=1.00;b=2.00;c=0;
for(j=0;j<n;j++)
{
sum+=b/a;
c=b;
b=a+b;
a=c;
if(a>66666||b>66666)
{
b=b/66666;
a=a/66666;
}
}
printf("%.2lf\n",sum);
i--;
}
return 0;
}