e-olymp 8671. Представимые суммой квадратов

Задача

Найдите все числа от $1$ до $n$, представимые в виде суммы двух квадратов различных натуральных чисел.

Входные данные

Одно натуральное число $n$ $( n \leqslant 10000)$.

Выходные данные

Выведите в одной строке в возрастающем порядке все числа от $1$ до $n$, представимые в виде суммы двух квадратов различных натуральных чисел.

Тесты

Входные данные  Выходные данные
1 5 5
2 10 5 10
3 13 5 10 13
4 20 5 10 13 17 20
5 30  5 10 13 17 20 25 26 29

Код программы

Решение

Для решения задачи создадим функцию check(), которая будет возвращать $true$, если число можно представить в виде суммы двух квадратов или же $false$, если нельзя. В функции перебираем всевозможные варианты $i$ и считаем $j$ для каждого $i$ по формуле $j=\sqrt{n-i^2}$, до тех пор пока не найдем целое (не равное $i$ ) $j$ или же не переберем все $i$. Просматриваем до $ i \cdot i < n $,  потому что сумма двух квадратов не может превышать заданного числа. Формулу получили выразив $j$ из исходной формулы $(i^2+j^2=n)$.

Ссылки

Условие задачи на e-olymp

Код программы на ideone

Related Images:

4 thoughts on “e-olymp 8671. Представимые суммой квадратов

    • Спасибо за комментарий. Исправила

  1. Нормально.
    Только удалите j = 0; и описывайте переменные при их первом использовании если это возможно j = sqrt (n - i * i);. Во всяком случае, как можно ближе к их первому упоминанию.
    Да!
    Еще один момент. Методически верно было бы cделать так, чтобы функция не сама печатала, а выводила логическое значение — представимо или нет. Тогда это действительно будет функция проверки, которую можно использовать не только для печати. По такому принципу построены все функции стандартной библиотеки. Например функция возвращает синус угла, а не печатает его.

  2. Я попробую сделать подробный разбор, поскольку задача в сто раз интереснее, чем кажется на первый взгляд.

    1. Не следует вызывать в цикле такие тяжеловесные функции как извлечение корня. Эта функция будет долго пыхтеть, вычисляя кучу знаков после запятой, а Вам всего-то нужно узнать будет ли корень целым числом. Чтобы вынести извлечение корня из цикла достаточно поступить так: Такой подход сокращает время работы программы процентов на 40.
    2. Стоит обратить вниманияе на то, что нам вообще не нужно проверять конкретное число. Нам нужно найти ВСЕ числа не превышающие $n$. А значит можно просто их все сгенерировать и пометить в массиве: Такое решение уже достаточно быстрое, чтобы попасть в таблицу рекордов. Но можно ещё ускорить. Знаете как?
    3. Можно попытаться решить задачу на основании следствия из Рождественской теоремы. Для этого придется найти все простые числа до 10000, которые сравнимы с 3 по модулю 4 и завести их в массив. Кроме того Ферма решал задачу для суммы квадратов целых чисел, а у нас натуральные. Есть о чем подумать.

Добавить комментарий