子序列的和 (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;
}

猜你喜欢

转载自blog.csdn.net/Huo6666/article/details/107146849