| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [C++]Число представить в виде 4 квадратов |
| Автор: Fedor1989 20.12.2007, 18:25 |
| Известно что всякое натуральное число можно представить в виде суммы не более чем четырех квадратов натуральных чисел. Для заданного N установить, сколько натуральных чисел, не превосходящих N, можно представить в виде суммы одного квадрата(т.е.само число) двух квадратов трех квадратов не менее чем четырех квадратов например 30=5^2+2^2+1^2 |
| Автор: Fedor1989 21.12.2007, 17:18 |
| народ помогите очень срочно надо |
| Автор: kali 22.12.2007, 02:09 | ||
Если очень срочно надо, вот тупой bruteforce
Числа больше 1000 лучше не вводить. А вообще прикольная задача. Я б ее кинул в занимательные задачи или алгоритмы. |
| Автор: Fin 22.12.2007, 03:26 |
| Можно применить видоизмененный "жадный алгоритм". Просто у числа брать квадратный корень. Потом у остатка и так далее. |
| Автор: Fedor1989 22.12.2007, 20:28 |
| Ты наверно не понял суть проблемы. Проблема заключается в том что любое число можно разбить в сумму четырех квадратов(но не более того) это для любого числа. вот смотри пример 5=2^2+1^2+0^2+0^2 23=3^2 + 3^2 + 2^2 + 1^2 |
| Автор: kali 22.12.2007, 20:34 |
| Я все отлично понял. Просто может существовать несколько вариантов разбиения. К слову, 0-не является натуральным числом. P.S. Для какого максимального N должна работать программа? |
| Автор: Fedor1989 22.12.2007, 21:37 |
| число [N] может любое, но кроме нуля. Ноль все равно разбить никак в принципе нельзя. |
| Автор: kali 22.12.2007, 21:40 |
| Тебя приведенный выше код устраивает? |
| Автор: Fedor1989 22.12.2007, 21:59 |
| Большое спосибо за код. Опиши по конкретней свой алгоритм,а то я несовсем понял его |
| Автор: kali 22.12.2007, 22:51 |
| Считываем число N. В главном цикле перебираем все числа i от 1 до N. Для каждого вычисляем max- максимальное натуральное число, квадрат которого не превышает i. Далее в четырех вложенных циклах перебираем все возможные комбинации чисел от 1 до max без учета комбинаций получаемых путем перестановок. Затем подсчитываем суммы квадратов одного, двух, трех, и четырех чисел для текущей комбинации. Если сумма совпадает с i, смотрим на сколько квадратов разбилось число, сравниваем с предыдущим значением и запоминаем минимальное. После перебора всех комбинаций, увеличиваем на единицу элемент массива результатов соответствующий минимальному количеству чисел на квадраты которых разбивается i. |