2016-08-31 2 views
1

Я новичок в программировании. Я пытаюсь сделать программу, которая дала два числа, она вычитает одну гармонику из другой. (Вход: п, м/выход: 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

Эта система («пауза») 'сделает вашу программу бесконечно медленной. Он останавливает форму программы, делая что-либо еще до нажатия клавиши. Если нажатие клавиши не подходит, он будет ждать вечно. –

ответ

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; 
+0

Вы правы, спасибо! – xglow

Смежные вопросы