HDU 5879 - Cure【2016 ACM 区域赛青岛赛区网络赛】

54 篇文章 0 订阅
17 篇文章 0 订阅

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


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值