数学では、 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 }
解法二: