习题2-8 子序列的和(subsequence)
输入两个正整数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。注意:本题有陷阱。
陷阱在于 输入的 n 和 m 平方后 过大 会溢出 所以 应该选择 浮点数
#include<stdio.h>
//#define LOCAL
int main()
{
double n, m;
double s;
int kase = 0; //不能写在循环 里面
#ifdef LOCAL
freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);
freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout);
#endif
while(scanf("%lf%lfd",&n,&m) == 2 && !(m == 0 && n == 0)){
s = 0;
while(n <= m){
s += 1.0 / (n*n); //括号 不要忘记 //另一种方法 可以定义整形 n,m 需要写成 1.0/n/n;的形式 防止溢出
n++;
}
printf("Case %d: %.5lf\n",++kase, s);
}
return 0;
}
// 陷阱在于 整数过大 平方可能溢出 需要用浮点数