输入两个正整数n<m<106输出1/n2+1/(n+1)2…+1/m^2,,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。
输入
两个正整数n<m<106,输入包含多组数据,结束标记为n=m=0。
输出
保留5位小数。
样例输入
2 4
65536 655360
0 0
样例输出
Case 1: 0.42361
Case 2: 0.00001
给出代码:
#include <stdio.h>
#include <math.h>
int main()
{
int n, m, kcase = 0;
// double s = 0;
// scanf("%d %d", &n, &m);
// for (int i = n; i <= m; i++)
// {
// s += 1 / (i * i);
// ++kcase;
// }
// printf("Case %d:%.5lf", kcase, s);
while (scanf("%d %d", &n, &m) && n + m != 0)
{
double s = 0;
kcase++;
for (int i = 0; i <= m; i++)
{
s = s + 1.0 / i / i; // //不能用s=s+1.0/(i*i);因为可能发生数据溢出,当i=m(655360)时,i*i的值超过了int的范围
}
printf("Case %d:%.5lf\n", kcase, s);
}
return 0;
}
注释掉的是我自己写的,有问题,无法运行。
1.根据样例的出入与输出很明显需要通过scanf来判断用户的输入之后再进行内部逻辑处理,输出数据。
2.这也是本题题目中的陷阱, 不能用s=s+1.0/(i*i);因为可能发生数据溢出,当i=m(655360)时,i*i的值超过了int的范围,int的取值范围为:-2^31 ---- 2^31-1 ,即:-2147483648 - 2147483647。
3.忽略了"结束标记为n=m=0",这个条件。
4.对于kcase的用法是否正确,自己心中也没底。