Нахождение всех пифагорейских троек менее 500

0

Мне нужно сделать программу, которая найдет все трофеи 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
...
  • 2
    Вы спрашиваете, почему ваш список короче, когда вы ограничиваете c * c <= 500 а не c < 500 ? Это должно быть довольно очевидно ...
  • 0
    Тест c <= 500 в if является избыточным, поскольку цикл for уже гарантирует, что это правда. Я не понимаю, почему этот код пропустит 3^2+4^2 = 5^2 , не могли бы вы объяснить или показать вывод? И, конечно, вы получите меньше результатов для c*c <= 500 . Это условие явно более ограничительное.
Показать ещё 3 комментария
Теги:

3 ответа

1

Как и другие люди, ваш код печатает правильные значения и не только начинается с более чем 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();
0

Ваш код как таковой подходит для меня. Как и в ней, не пропустите ни одного триплета.

Однако, я думаю, вы можете сделать это более эффективным (O(n^2logn) instead of O(n^3)), исключив цикл for для c. Просто вычислите a^2 + b^2 и выполните двоичный поиск этого числа в предварительно построенном списке квадратов чисел до 500.

Конечно, для этого потребуется O (n) дополнительное пространство памяти.

0

Вы можете опустить весь цикл над 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²

Ещё вопросы

Сообщество Overcoder
Наверх
Меню