Problem Description
Given an integer n, we only want to know the sum of 1/k2 where k from 1 to n.
Input
There are multiple cases.
For each test case, there is a single line, containing a single positive integer n.
The input file is at most 1M.
Output
The required sum, rounded to the fifth digits after the decimal point.
Sample Input
1
2
4
8
15
Sample Output
1.00000
1.25000
1.42361
1.52742
1.58044
题意:给出一个 n,求出 1 到 n 的1/(n^2)的和。
我是通过打表找出了后面的一个临界值,过界后得数就不变了,前面的直接计算,不过可以将已经计算出来的保存一下, 这样快一点。
#include <cstdio>
#include <cstring>
double num[130000] = {0};
char str[100000+5];
int main()
{
long long n;
num[1] = 1;
while (scanf("%s", str) != EOF)
{
n = 0;
int cur = 0;
while (str[cur] == '0')
cur++;
int len_true = strlen(str);
int len_false = len_true - cur;
if (len_false > 6)
{
printf("1.64493\n");
continue;
}
for (int i = cur; i < len_true; ++i)
{
n *= 10;
n += str[i] - '0';
}
if (n >= 123964)
{
printf("1.64493\n");
continue;
}
double x;
double ans = 0;
for (long long i = n; i > 0; --i)
{
if (num[i] != 0)
{
ans += num[i];
break;
}
x = (double)1/i/i;
ans += x;
}
num[n] = ans;
printf("%.5lf\n", num[n]);
}
return 0;
}