lightoj 1234 Harmonic Number

题目大意:

  给一个数n,求出1/1+1/2+1/3+....+1/(n-1)+1/n;求中1<=n<=100000000。

解题思路:

  由于n的取值范围太大,打标的话就会超内存,所以简单的计算一下内存大小,可以打一个只存n=40,80,120······的表,

这样一来,对于n最坏的情况也就是循环39次,

代码:

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 #define maxn 2500005
 9 #define N 100000005
10 double a[maxn];
11 
12 int main ()
13 {
14     int t, n, m, i, j, l = 1;
15     double num = 0;
16     for (i=j=1; i<N; i++)
17     {
18         num += 1.0 / i;
19         if (i % 40 == 0)
20             a[j++] = num;
21     }
22     scanf ("%d", &n);
23     while (n --)
24     {
25 
26         scanf ("%d", &m);
27         if (m == 1)
28             printf ("Case %d: 1\n", l++);
29         else if (m == 2)
30             printf ("Case %d: 1.5\n", l++);
31         else if (m == 6)
32             printf ("Case %d: 2.450\n", l++);
33         else
34         {
35             num = a[m/40];
36             int s = m - m % 40;
37             m = m % 40;
38             while (m --)
39             {
40                 s ++;
41                 num += 1.0/s;
42             }
43             printf ("Case %d: %.10f\n", l++, num);
44         }
45     }
46     return 0;
47 }

 

  

你可能感兴趣的:(number)