2015-04-28 2 views
0

Следующий код - это алгоритм для определения количества целых треугольников, причем их большая сторона меньше или равна MAX, которые имеют целочисленную медиану. Версия Python работает, но слишком медленна для большего N, в то время как версия C++ намного быстрее, но не дает правильного результата.C++ и Python версия того же алгоритма, дающая разные результаты

Когда MAX 10, C++ и Python возвращают 3.

Когда MAX 100, Python возвращает 835 и C++ возвращает 836.

Когда MAX 200, Python возвращает 4088 и C++ возвращает 4102.

Когда MAX 500, Python возвращает 32251 и C++ возвращает 32296.

Когда МАКС 1000, Python возвращает 149869 и C++ возвращает 150002.

Вот ++ версии C:

#include <cstdio> 
#include <math.h> 

const int MAX = 1000; 

int main() 
{ 
    long long int x = 0; 
    for (int b = MAX; b > 4; b--) 
    { 
     printf("%lld\n", b); 
     for (int a = b; a > 4; a -= 2){ 
      for (int c = floor(b/2); c < floor(MAX/2); c+=1) 
      { 
       if (a+b > 2*c){ 
        int d = 2*(pow(a,2)+pow(b,2)-2*pow(c,2)); 
        if (sqrt(d)/2==floor(sqrt(d)/2)) 
         x+=1; 
       } 
      } 
      } 
    } 
    printf("Done: ");  
    printf("%lld\n", x); 
} 

Вот оригинальная версия Python:

import math 

def sumofSquares(n): 
    f = 0 
    for b in range(n,4,-1): 
     print(b) 
     for a in range(b,4,-2): 
      for C in range(math.ceil(b/2),n//2+1): 
       if a+b>2*C: 
        D = 2*(a**2+b**2-2*C**2) 
        if (math.sqrt(D)/2).is_integer(): 
         f += 1 
    return f 

a = int(input()) 
print(sumofSquares(a)) 
print('Done') 

Я не слишком хорошо знаком с C++, так что я понятия не имею, что может случаться, что вызывает это (возможно переполнение ошибка?).

Конечно, любая оптимизация алгоритма более чем приветствуется!

+1

Ну, для одной версии C++ используется 'floor', в то время как python использует' ceil'. Кроме того, версия C++ не делит на 2 'if (sqrt (d) == floor (sqrt (d)))', а python - 'if (math.sqrt (2 * D)/2) .is_integer() : ' – smac89

+0

Версия python дает мне' 4' для ввода '10'. – huu

+0

Оба они имеют умножение на 2 (только в разных местах), но только у Python есть разделитель на 2 после квадратного корня. –

ответ

1

Вопрос заключается в том, что диапазон для c (C в питоне) переменных не совпадают. Для того, чтобы привести их в соответствие с вашего диапазона существующих C++, вы можете изменить свой цикл питона:

for C in range(int(math.floor(b/2)), int(math.floor(n/2))): 
    ... 

Чтобы сделать их эквивалент в существующий диапазон питона, вы можете изменить C++ цикл для:

for (int c = ceil(b/2.0); c < MAX/2 + 1; c++) { 
    ... 
} 

В зависимости от того, какой цикл изначально правильный, это приведет к совпадению результатов.

+0

Я просто попытался изменить цикл на C++, но теперь результат еще больше. Он возвращает 150632, когда MAX 1000! –

+1

Какой * должен * быть правильным ответом? Весь мой ответ показывает, что ваши алгоритмы дают разные результаты, потому что они построены по-разному. – huu

+1

Правильный ответ будет 149869, тот, который выдается Python. –

-1

Это швы некоторые проблемы могли бы быть здесь:

(sqrt(d)==floor(sqrt(d))) 
Смежные вопросы