子序列的和 (C的数据溢出)

最近在看紫皮的算法竞赛入门经典,里面有一道习题我自己打的时候出现了问题。

题目:输入两个正整数 n<m<10^6,输出 1/n^2 + 1/(n+1)^2 + …… + 1/m^2,保留 5 位小数。例如 n=2,m=4 时答案是 0.42361;n=65536,m=655360 时答案为 0.00001。
注意:本题有陷阱。
样例输入:

2 4
65536 655360
0 0

样例输出:

Case 1: 0.42361
Case 2: 0.00001

一开始写这个题的时候为了节省时间想把循环过程中1/(n^2)结果小于1e-6(小数点后六位)的直接不算,因为太小了就算加到和里也很难进一,后来我测试第二个数据的时候发现这样是错的,因为虽然当n=65536时n的平方倒数小于1e-6但是很多个小的数字加到一起还是能进一的,群众的力量很大啊哈哈。然后改了改。
还有一个要注意的就是使用double类型数据的时候,我们求和肯定得要把除法的结果保留小数部分,所以是sum+=1.0000000/(i*i),最后结果输出的时候要保留五位小数,最后结果才是对的。

代码如下:

#include<stdio.h>
int main()
{
 	long long n,m;
 	int count=0;
 	while(scanf("%lld%lld",&n,&m)&&(n!=0&&m!=0))
 	{
  		double sum=0.00;
  		if(n>=m||m>1000000||n>1000000)
  		continue;
  		for(long long i=n;i<=m;i++)
  		{
   			sum+=1.0000000/(i*i);
  		}
  		printf("Case%d: %.5lf\n",++count,sum);
 	}
 	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值