子序列的和(subsequence)
输入两个正整数n<m<10^6,输出1/n^2+1/(n+1)^2+......+1/m^2,保留5位小数。输入包含多组数据,结束标记为n=m=0.提示:本题有陷阱
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n,m;
int kcase=1;
while(scanf("%d %d",&n,&m)!=EOF&&n&&m)
{
double sum=0;
for(int i=n;i<=m;i++)
{
sum=sum+1.0/i/i;
}
printf("Case %d: %.5f\n",kcase++,sum);
}
return 0;
}
陷阱在于,如果采用sum=sum+1.0/(i*i);的话,当i为655360的时候,i*i会发生溢出,所以为了避免这个问题的发生,我们采用进行两次连除的形式:sum=sum+1.0/i/i;