更快的谐波数?

时间:2016-08-31 16:18:42

标签: c++ performance numbers

我是编程的初学者。我试图制作一个给出两个数字的程序,它从另一个数字中减去一个谐波。 (输入:n,m /输出:Hn-Hm)

#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;

int main() {
double n1, n2, h1 = 0, h2 = 0, i;       // n = number, h = harmonic
cin >> n1 >> n2;

    if (n1 == 0) {
        h1 = 0;
    }
    else {
        for (i = 1; i <= n1; i++) { 
            h1 += 1 / i;
            if (i <= n2) {
                h2 += 1 / i;
            }
        }
    }
    cout << fixed << setprecision(10) << h1 - h2 << endl;

system("pause");
return 0;
}

该计划给出了正确的结果,但我正在使用我所在大学的一个网站,并表示该计划很慢。我试图让它更快,但我无法弄清楚如何。 感谢。

1 个答案:

答案 0 :(得分:4)

您无需计算完整的谐波数。假设n1 < n2,这两个系列将是:

H(n1) = 1 + 1/2 + 1/3 + ... + 1/n1
H(n2) = 1 + 1/2 + 1/3 + ... + 1/n1 + 1/(n1+1) + 1(n1+2) + ... + 1/n2

因此,当您减去H(n2) - H(n1)时,两个系列中的第一个n1项会相互抵消,所以

H(n2) - H(n1) = 1/(n1+1) + 1(n1+2) + ... + 1/n2

如果n1 > n2结果是否定的结果。

double result = 0, mult = 1;
if (n1 > n2) {
    double temp = n1;
    n1 = n2;
    n2 = temp;
    mult = -1;
}
for (double denom = n1+1; denom <= n2; denom++) {
    result += 1/denom;
}
result *= mult; // Flip the sign if we swapped n1 and n2
cout << fixed << setprecision(10) << result << endl;