题目:
输入两个正整数 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;
}