Мне нужно сделать программу, которая найдет все трофеи Pythagorean для a, b и c до 500. Здесь мой код:
int main()
{
for (int a = 1; a <= 500; a++)
{
for (int b = 1; b <= 500; b++)
{
for (int c = 1; c <= 500; c++)
{
if ((a*a)+(b*b) == c*c && c <= 500)
{
cout << a << " + " << b << " = " << c << endl;
}
}
}
}
}
Мои для операторов проверяют каждое значение в c, затем b, затем a. Поэтому моя проблема, как представляется, находится внутри оператора if. Он проверяет, соответствует ли квадрат и квадрат b квадрату c. Это здорово. Однако что-то интересное происходит после утверждения и утверждения. Если я сделаю это c * c <= 500, я получаю значительно более короткий список меньших чисел, чем если c <500. Однако, если вы используете c <500, то программа запускается в 200-х годах и идет вверх, без видимых троек, таких как 3+ 4 = 5. Мне любопытно, почему это происходит, потому что, очевидно, я не печатаю каждую тройку за каждое значение.
Edit: Хорошо, очевидно, что разница в c и c * c огромна, но я использовал c * c, чтобы проверить, что было странно в программе, извините за то, что я не был ясен. Кроме того, удаление и выражение представляет ту же проблему. Я не понимаю, почему программа в ее текущем состоянии начинается в 200, а не в 3 + 4 = 5. Здесь текущий выход:
208 + 306 = 370
208 + 390 = 442
209 + 120 = 241
210 + 72 = 222
210 + 112 = 238
210 + 176 = 274
210 + 200 = 290
210 + 280 = 350
210 + 416 = 466
...
Как и другие люди, ваш код печатает правильные значения и не только начинается с более чем 200.
208 + 306 = 370
Я думаю, ваша проблема в том, что выход переполняет ваш доступный буфер экрана. Следовательно, вверху вы увидите его начиная с 208 + 306 = 370.
Попробуйте записать результат в файл.
#include<fstream>
ofstream myfile("results.txt");
for (int a = 1; a <= 500; a++)
{
for (int b = 1; b <= 500; b++)
{
for (int c = 1; c <= 500; c++)
{
if ((a*a)+(b*b) == c*c && c <= 500)
{
cout << a << " + " << b << " = " << c << endl;
myfile << a << " + " << b << " = " << c << endl;
}
}
}
}
myfile.close();
Ваш код как таковой подходит для меня. Как и в ней, не пропустите ни одного триплета.
Однако, я думаю, вы можете сделать это более эффективным (O(n^2logn) instead of O(n^3)
), исключив цикл for для c. Просто вычислите a^2 + b^2
и выполните двоичный поиск этого числа в предварительно построенном списке квадратов чисел до 500.
Конечно, для этого потребуется O (n) дополнительное пространство памяти.
Вы можете опустить весь цикл над c
и хорошую часть единицы над b
. Нам нужно только проверить b
в диапазоне, начиная с текущего значения a
[предотвращать печать одного и того же триплека дважды] и заканчиваться на sqrt(500^2 - a^2)
[потому что c
не будет <=500
для больших b
]. Я даю решение на Java, которое не должно быть проблемой для адаптации:
import java.lang.Math;
public class Pythagorean {
public static void main(String[] args) {
for (int a=1; a<500; a++)
for (int b=a; b<Math.sqrt(250000-a*a); b++)
if (Math.sqrt(a*a+b*b) == Math.round(Math.sqrt(a*a+b*b)))
System.out.println(""+a+"² + "+b+"² = "+(int)Math.round(Math.sqrt(a*a+b*b))+"²");
}
}
Вывод:
3² + 4² = 5²
5² + 12² = 13²
6² + 8² = 10²
7² + 24² = 25²
8² + 15² = 17²
9² + 12² = 15²
9² + 40² = 41²
10² + 24² = 26²
11² + 60² = 61²
12² + 16² = 20²
[...]
300² + 315² = 435²
319² + 360² = 481²
320² + 336² = 464²
325² + 360² = 485²
340² + 357² = 493²
c * c <= 500
а неc < 500
? Это должно быть довольно очевидно ...c <= 500
вif
является избыточным, поскольку циклfor
уже гарантирует, что это правда. Я не понимаю, почему этот код пропустит3^2+4^2 = 5^2
, не могли бы вы объяснить или показать вывод? И, конечно, вы получите меньше результатов дляc*c <= 500
. Это условие явно более ограничительное.