Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更快的谐波数?_C++_Performance_Numbers - Fatal编程技术网

C++ 更快的谐波数?

C++ 更快的谐波数?,c++,performance,numbers,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

我是编程的初学者。我试图制作一个程序,给定两个数字,它从另一个谐波中减去一个谐波。输入: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;
}
这个程序给出了正确的结果,但我使用的是我所在大学的一个网站,上面说这个程序很慢。我试图让它更快,但我不知道怎么做。
谢谢。

您不需要计算全部谐波数。假设n1
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
所以当你减去Hn2-Hn1,两个序列中的第一个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;

您不需要计算全部谐波数。假设n1
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
所以当你减去Hn2-Hn1,两个序列中的第一个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;

添加对谐波的描述,或者至少添加一个参考。系统暂停会使程序无限慢。它会停止程序窗体执行更多操作,直到按下一个键。如果没有按键,它将永远等待。我要做的一件事是去掉循环中的分支。没有必要同时计算两个谐波数。两个级数的前n项相减时会相互抵消,因此只需计算更高级数的剩余项。添加谐波描述,或至少一个参考。系统暂停将使程序无限慢。它会停止程序窗体执行更多操作,直到按下一个键。如果没有按键,它将永远等待。我要做的一件事是去掉循环中的分支。没有必要同时计算两个谐波数。两个级数的前n项在减去它们时会相互抵消,因此只需计算较高级数的剩余项。