Следующий код - это алгоритм для определения количества целых треугольников, причем их большая сторона меньше или равна 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++, так что я понятия не имею, что может случаться, что вызывает это (возможно переполнение ошибка?).
Конечно, любая оптимизация алгоритма более чем приветствуется!
Ну, для одной версии C++ используется 'floor', в то время как python использует' ceil'. Кроме того, версия C++ не делит на 2 'if (sqrt (d) == floor (sqrt (d)))', а python - 'if (math.sqrt (2 * D)/2) .is_integer() : ' – smac89
Версия python дает мне' 4' для ввода '10'. – huu
Оба они имеют умножение на 2 (только в разных местах), но только у Python есть разделитель на 2 после квадратного корня. –