11行代碼AC——習題2-4 子序列的和(subsequence)——解題報告

勵志用盡量少的代碼做高效的表達。


題目描述:

輸入兩個正整數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;
} 

如果這篇博客對你產生了幫助,就請給博主點一個小小的贊吧!大家的點贊是我更新的最大動力!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章