最近在看紫皮的算法竞赛入门经典,里面有一道习题我自己打的时候出现了问题。
题目:输入两个正整数 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;
}