zoukankan      html  css  js  c++  java
  • Harmonic Number (LightOJ 1234)(调和级数 或者 区块储存答案)

    题解:隔一段数字存一个答案,在查询时,只要找到距离n最近而且小于n的存答案值,再把剩余的暴力跑一遍就可以。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e8 + 10;
    const int M = 2e6 + 10;
    double a[M];
    
    void Init()
    {
        a[0] = 0.0;
        double ans = 1;
        for( int i = 2; i < N; i ++)
        {
            ans += 1.0 / i;
            if(i % 50 == 0)
            {
                a[i/50] = ans;
            }
        }
        return ;
    }
    
    int main()
    {
        int t,n,cas = 0;
        Init();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            int now = n / 50;
            double ans = a[now];
            for(int i = now*50 + 1; i <= n; i ++)
            {
                ans += 1.0 / i;
            }
            printf("Case %d: %.9lf
    ",++cas,ans);
        }
        return 0;
    }

    数论正解:

    知识点:

         调和级数(即f(n))至今没有一个完全正确的公式,但欧拉给出过一个近似公式:(n很大时)

          f(n)≈ln(n)+C+1/2*n    

          欧拉常数值:C≈0.57721566490153286060651209

          c++ math库中,log即为ln。

    (转自:https://www.cnblogs.com/shentr/p/5296462.html

        因为公式存在误差,在数值n比较小的时候直接暴力求解。

    /** 转自:https://www.cnblogs.com/shentr/p/5296462.html */
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    const double r=0.57721566490153286060651209;     //欧拉常数
    double a[10000];
    
    int main()
    {
        a[1]=1;
        for (int i=2;i<10000;i++)
        {
            a[i]=a[i-1]+1.0/i;
        }
        int n;
        cin>>n;
        for (int kase=1;kase<=n;kase++)
        {
            int n;
            cin>>n;
            if (n<10000)
            {
                printf("Case %d: %.10lf
    ",kase,a[n]);
            }
            else
            {
                double a=log(n)+r+1.0/(2*n);
                //double a=log(n+1)+r;
                printf("Case %d: %.10lf
    ",kase,a);
            }
        }
        return 0;
    }

    Problem

    In mathematics, the nth harmonic number is the sum of the reciprocals of the first n natural numbers:

    In this problem, you are given n, you have to find Hn.

    Input

    Input starts with an integer T (≤ 10000), denoting the number of test cases.

    Each case starts with a line containing an integer n (1 ≤ n ≤ 108).

    Output

    For each case, print the case number and the nth harmonic number. Errors less than 10-8 will be ignored.

    Sample Input

    12

    1

    2

    3

    4

    5

    6

    7

    8

    9

    90000000

    99999999

    100000000

    Sample Output

    Case 1: 1

    Case 2: 1.5

    Case 3: 1.8333333333

    Case 4: 2.0833333333

    Case 5: 2.2833333333

    Case 6: 2.450

    Case 7: 2.5928571429

    Case 8: 2.7178571429

    Case 9: 2.8289682540

    Case 10: 18.8925358988

    Case 11: 18.9978964039

    Case 12: 18.9978964139

  • 相关阅读:
    PHP培训教程 PHP里10个鲜为人知但却非常有用的函数
    跟我学Spring Boot(一)创建Spring Boot 项目
    android 4.0 webview 无法播放视频
    vs2008 安装部署 启动项
    android 使用webview 加载网页
    hbase 无法打开60010网页
    oracle 提示没有监听
    hbase 基本命令
    hbase 单机版安装
    win7 64位远程连接oracle11g64位
  • 原文地址:https://www.cnblogs.com/lcchy/p/10139565.html
Copyright © 2011-2022 走看看