2016-08-31 1 views
1

私はプログラミングの初心者です。私は、2つの数字を与えて1つの調波を他の調波から引くプログラムを作ろうとしています。 (入力: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

https://en.wikipedia.org/wiki/Harmonic_number – Barmar

+0

'system(" pause ")'はプログラムを無限に遅くします。キーが押されるまで何もしないでプログラムのフォームを停止します。 keypressが来ていない場合、それは永遠に待つでしょう。 –

答えて

4

完全な高調波数を計算する必要はありません。 n1 < n2と仮定すると、2つのシリーズは次のようになります。

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)を引くときに、2つのシリーズの最初の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; 
+0

あなたは正しいです、ありがとう! – xglow

関連する問題