2/1 3/2 5/3 8/5 13/8 21/13......求出这个数列的前N项之和,保留两位小数。当n为十万位大数时的精确度办法

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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值