输入两个正整数n<m<10^6,输出
保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1:0.42361
Case 2:0.00001
分析:此题显而易见应该采用1个for循环,通过一个变量sum即可实现,每计算完一项,就把计算结果保存在sum中。但是应该注意一个问题,1.0/(n*n)的BUG很隐蔽,原因是因为n很大时,n×n会溢出,所以为了避免这个问题,我们应该采用1.0/n/n的形式。
#include <stdio.h>
int main(int argc, char *argv[])
{
int m,n,kase=0;
while (scanf("%d%d",&n,&m)==2&&n&&m)
{
double sum=0;
for (int i=n;i<=m;i++){
sum+=1.0/i/i;
}
printf("Case %d:%.5f\n",++kase,sum);
}
return 0;
}
运行结果: