LightOJ-1234-高調Number-調和級数オイラーの定数+ /ダイレクトヒットテーブル

数学では、  N 番目の  高調波の数は、第1の逆数の和であり、  nは  自然数。

  

この問題では、あなたが与えられた  n個、あなたが見つける必要が  HのNを

入力

入力は整数で始まり  T(10000以下)テストケースの数を表します。

各ケースは、整数を含む行から始まる  (1≤N≤10 N 8

出力

各場合について、ケース番号と印刷  のn 番目の  高調波番号。以下のエラー  10 -8は、  無視されます。

 

サンプル入力

12

1

2

3

4

5

6

7

8

9

90000000

99999999

100000000

 

サンプル出力

ケース1:1

ケース2:1.5

ケース3:1.8333333333

ケース4:2.0833333333

ケース5:2.2833333333

ケース6:2.450

事例7:2.5928571429

ケース8:2.7178571429

ケース9:2.8289682540

ケース10:18.8925358988

ケース11:18.9978964039

ケース12:18.9978964139

解決策1:

調和級数(即ち、F(N))がない完全に補正式を有するが、オイラーを通して近似式を与えます

とき、nが大きい場合:

          F(N)LN(N)+ C +1(2 * N)

          オイラーの定数値:C≈ 0.57721566490153286060651209

          C ++数学ライブラリは、ログがLNです。

nが小さい場合:

      直接の要求は、この時間は、式は非常に正確ではありません。

 

 1 #include<stdio.h>
 2 #include<cmath>
 3 #include<string.h>
 4 typedef long long ll;
 5 using namespace std;
 6 
 7 const double c=0.57721566490153286060651209;
 8 //f(n)≈ln(n)+C+1/(2*n)
 9 
10 double sum[1000200];
11 
12 void fn()
13 {
14     sum[1]=1.0;
15     for(int i=2; i<=100200; i++)
16     {
17         sum[i]=sum[i-1]+1.0/(i*1.0);
18     }
19 }
20 int main()
21 {
22     fn();
23     int t;
24     scanf("%d",&t);
25     int n,tt=1;
26     while(t--)
27     {
28         scanf("%d",&n);
29         if(n<=100200)
30             printf("Case %d: %.10lf\n",tt++,sum[n]);
31         else
32         {
33             double x=log(n)+c+1.0/(2.0*n);
34             printf("Case %d: %.10f\n",tt++,x);
35         }
36     }
37     return 0;
38 }
View Code

 

 

 

解法二:

 

おすすめ

転載: www.cnblogs.com/OFSHK/p/11327038.html