Задача
Найдите все числа от $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 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import java.util.*; import java.lang.*; import java.io.*; import java.util.Scanner; public class Ideone{ static boolean check(int n) { for (int i = 1; i * i < n; i++) // перебор всех i { double j = Math.sqrt (n - i * i); if ((j == Math.floor(j)) && (j != i)) // проверка j целое или дробное { return true; // комбинация найдена - возвращаем true } } return false; // комбинация не найдена - возвращаем false } public static void main(String a[]) { Scanner in = new Scanner(System.in); int n = in.nextInt(); // считываем число, до которого будем искать for (int k = 5; k <= n; k++) // проверка для каждого k if (check(k)) System.out.print(k + " "); in.close(); } } |
Решение
Для решения задачи создадим функцию 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