21. 子序列的和 subsequence

题目:

输入两个正整数 n < m < 10^6 , 输出 1 / n2 + 1 / (n + 1)2 + ...+ 1 / m2,保留5位小数。输入包含多组数据,结束标记为 n = m = 0 。提示:本题有陷阱。

样例输入:

2  4

65536  655360

0  0

样例输出:

Case 1: 0.42361

Case 2: 0.00001

思路:

陷阱还是在于乘法溢出。若是用常规方法,将分母乘起来,然后在除,那么无论如何,都是溢出。解决方法:将分母连除两次即可。

代码:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
int n = 0, m = 0;
int kase = 0;

while ((cin >> n >> m) && n && m) {
double sum = 0.0;
for (int i = n; i <= m; ++i) {
sum += static_cast<double >(1) / i / i;
}

cout << "Case " << ++kase << ": ";
cout << setprecision(5) << fixed << sum << endl;
}

return 0;
}

猜你喜欢

转载自www.cnblogs.com/Hello-Nolan/p/12122156.html
21.