励志用尽量少的代码做高效的表达。
题目描述:
输入两个正整数n<m<106,输出1/(n²)+1/((n+1)²)+……+1/(m²),保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001
思路:
1、由于数量太大,如果按照传统的除法相加一定会溢出。因此不难想到用“在线处理”算法解题,即每次循环都及时算出结果,避免过程数过大溢出。
2、方法想到了,如何实施呢? 1/n²=1/(n*n)=(1/n)*(1/n)=(1/n)/n = 1/n/n;
按此思路解题即可。
代码:
#include<stdio.h>
int main() {
int n, m; while(scanf("%d%d",&n,&m) && n) {
double sum = 0;
while(n <= m) {
sum += 1.0/n/n; ++n;
}
printf("%.5lf\n", sum);
}
return 0;
}