勵志用盡量少的代碼做高效的表達。
題目描述:
輸入兩個正整數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;
}