Поиск всех пифагорейских троек по формуле Евклида

Цель этой программы — найти все пифагорейские тройки для каждого значения (a, b, c) менее 500, используя формулу Евклида (a = m ^ 2 -n ^ 2, b = 2mn, c = m ^ 2 + n ^ 2.) Так вот мой код.

int main()
{
clock_t start = clock()/ (CLOCKS_PER_SEC/1000);

for (int m = 1; m <= 500; m++)
{

for (int n = 1; n <= 500; n++)
{

int a = (m*m)-(n*n);
int b = 2*m*n;
int c = (m*m)+(n*n);
if (m > n && a + b == c)
{
cout << a << " + " << b << " = " << c << endl;
}
}
}
clock_t finish = clock()/ (CLOCKS_PER_SEC/1000);
cout << "completed in " <<clock() << " ms";
return 0;
}

Я попробовал это, и мой вывод ничего. Я думал, что это сработает так: для каждого целого числа m, меньшего / равного 500 и начинающегося с 1, добавляйте один к m каждый раз. То же самое для n. Затем вставьте эти значения в формулу и, если a + b == c, он напечатает эти значения, найдя мои тройки. Но я не получаю вывод.

1

Решение

a + b = (m^2 + 2mn - n^2) = (m+n)^2 - 2n^2
c = m^2 + n^2 = (m+n)^2 - 2mn

Вы требовали a + b = c

--> 2n^2 = 2mn
--> m = n

Так как вам также требуется m > nВы не можете найти никакого решения.

3

Другие решения

Ваше состояние не так: вы пытаетесь получить

(m ^ 2 — n ^ 2) + 2mn = (m ^ 2 + n ^ 2)

(m — n) ^ 2 = m ^ 2 + n ^ 2

но для n > 0 у вас всегда будет следующее строгое неравенство:

(м — н) ^ 2 < м ^ 2 < м ^ 2 + п ^ 2

Согласно википедии, вы хотели проверить, равна ли сумма квадратов —

(a ^ 2 + b ^ 2) == c ^ 2

0

Я выяснил проблему; в последней итерации программы я должен ограничить с <= 500:

int main()
{
clock_t start = clock()/ (CLOCKS_PER_SEC/1000);

for (int n = 1; n <= 500; n++)
{
for (int m = n+1; m <= 500; m++)
{
int a = (m*m)-(n*n);
int b = 2*m*n;
int c = (m*m)+(n*n);
if ((a*a) + (b*b) == (c*c) && c <= 500)
{
cout << a << " + " << b << " = " << c << endl;
}
}
}
clock_t finish = clock()/ (CLOCKS_PER_SEC/1000);
cout << "completed in " <<clock() << " ms";
return 0;
}

Таким образом, программа не идет долго, как у меня были проблемы с. Спасибо вам всем!

0

Вы допустили пару ошибок в своей реализации (см. Исправление ниже):

int main()
{
for (int n = 1; n <= 500; ++n) // note the swap for the loops
{
for (int m = n + 1; m <= 500 && (m*m + n*n) <= 500; ++m) // note that m starts at n + 1
{
int a = (m*m)-(n*n);
int b = 2*m*n;
int c = (m*m)+(n*n);
// Euclid already proved this, so there is no need to test it.
std::cout << a << " + " << b << " = " << c << std::endl;
}
}
return 0;
}
  1. Формула Евклида требует m > n, поэтому нет необходимости проверять значения, которые не соответствуют этим критериям
  2. Ваш тест (a + b) == c никогда не будет работать в любом случае. Формула a^2 + b^2 = c^2 — это не значит a + b = c,
0
По вопросам рекламы [email protected]