我需要一个时间复杂度小于 O(n) 的算法。
目前我有这个算法:
int n;
sum=n;
for(int i=2;i<=n;i++)
{
sum+=n/i;
}
那是 n * (1/1 + 1/2 + 1/3 + 1/4 + .. + 1/n)
后者的和是第n次谐波数,具有较好的近似性。
用 large 检查它n
是否对你来说足够精确 - 显然,对于 small n
s 只需使用你的“算法”或查找表。
import math
euler=0.5772156649015
sum=0
show=10
for i in range(1,1000001):
sum += 1.0/i
if i == show:
approx = math.log(i) + euler + 1.0/(2*i)
print "%7d %.2e" % (i, approx - sum)
show *= 10
10 8.33e-04
100 8.33e-06
1000 8.33e-08
10000 8.33e-10
100000 8.45e-12
1000000 9.93e-13