Цель этой программы — найти все пифагорейские тройки для каждого значения (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, он напечатает эти значения, найдя мои тройки. Но я не получаю вывод.
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
Вы не можете найти никакого решения.
Ваше состояние не так: вы пытаетесь получить
(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
Я выяснил проблему; в последней итерации программы я должен ограничить с <= 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;
}
Таким образом, программа не идет долго, как у меня были проблемы с. Спасибо вам всем!
Вы допустили пару ошибок в своей реализации (см. Исправление ниже):
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;
}
m > n
, поэтому нет необходимости проверять значения, которые не соответствуют этим критериям(a + b) == c
никогда не будет работать в любом случае. Формула a^2 + b^2 = c^2
— это не значит a + b = c
,