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;
} 

如果这篇博客对你产生了帮助,就请给博主点一个小小的赞吧!大家的点赞是我更新的最大动力!
发布了97 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/105779667
今日推荐