var
N : word;
NS : word;
i, j, k : word;
Lj : word;
begin
Writeln (#10,' Сумма трёх квадратов');
Write (' n = '); Readln (N);
Lj:= Round (Sqrt(N-2));
for i:= 1 to Lj do
for j:= 1 to Lj do
for k:= 1 to Lj do
begin
NS:= i*i + j*j + k*k;
if NS > N then
Break;
if NS = N then
begin
Writeln (n:6,' = ',i,'*2 + ',j,'*2 + ',k,'*2');
Halt;
end;
end;
Writeln ( ' Невозможно представить');
end.
Как можно реализовать без вычисления корня и округления его значения? ( Lj:= Round (Sqrt(N-2));)
Другие языки программирования и технологии
Паскаль. Представить натуральное число n в виде суммы трёх квадратов натуральных чисел.
Можно и без вычисления корня, хотя это будет кривовато и неэффективно, но если заметить 4 вещи:
1. NS:= i*i + j*j + k*k; - вы регулярно находите квадраты натуральных чисел, можно заранее занести квадраты в массив, а потом использовать его при проверке. Массив получится достаточно небольшим, так как N - word, то 256 элементов хватит. Поэтому вместо извлечения корня нужно будет просто найти индекс первого элемента, квадрат которого > N.
2. Из трех натуральных чисел, возводимых в квадрат, старшим назовем то, которое >= двух остальных. Понятно, что квадрат старшего должен быть в диапазоне [1, N-2]. Поэтому диапазон внешнего цикла (по i) 1…sqrt(N-2). Но следующий цикл (по j) нужно вести не до sqrt, а до i.
3. Во внешнем цикле мы фиксируем значение старшего элемента, поэтому вложенный цикл (по j) ограничен индексом i сверху. Можно его ограничить сильнее, но это неэффективно - придётся считать корень (N-i*i) на каждом цикле, а вы просили этого не делать. Гораздо проще ввести переменную N1:=N-i*i, которую потом пытаться разложить в сумму двух квадратов.
4. Вообще говоря, в вашем примере третий цикл не нужен, достаточно проверить, что N2:=N-i*i-j*j является квадратом натурального числа. Это делается простым корнем и округлением. Но чтобы найти корень числа БЕЗ его извлечения, нужно найти его индекс в таблице квадратов (см. пункт 1) поэтому цикл всё же будет.
1. NS:= i*i + j*j + k*k; - вы регулярно находите квадраты натуральных чисел, можно заранее занести квадраты в массив, а потом использовать его при проверке. Массив получится достаточно небольшим, так как N - word, то 256 элементов хватит. Поэтому вместо извлечения корня нужно будет просто найти индекс первого элемента, квадрат которого > N.
2. Из трех натуральных чисел, возводимых в квадрат, старшим назовем то, которое >= двух остальных. Понятно, что квадрат старшего должен быть в диапазоне [1, N-2]. Поэтому диапазон внешнего цикла (по i) 1…sqrt(N-2). Но следующий цикл (по j) нужно вести не до sqrt, а до i.
3. Во внешнем цикле мы фиксируем значение старшего элемента, поэтому вложенный цикл (по j) ограничен индексом i сверху. Можно его ограничить сильнее, но это неэффективно - придётся считать корень (N-i*i) на каждом цикле, а вы просили этого не делать. Гораздо проще ввести переменную N1:=N-i*i, которую потом пытаться разложить в сумму двух квадратов.
4. Вообще говоря, в вашем примере третий цикл не нужен, достаточно проверить, что N2:=N-i*i-j*j является квадратом натурального числа. Это делается простым корнем и округлением. Но чтобы найти корень числа БЕЗ его извлечения, нужно найти его индекс в таблице квадратов (см. пункт 1) поэтому цикл всё же будет.
Можно в for'е вместо Lj сам N(или Round(N/2), где-то так) верхней границей указать. Но быстрее работать будет, как правило, с корнем. А писали вы?
Похожие вопросы
- Помогите пожалуйста!Паскаль. Дано натуральное число N. Получить наименьшее число вида 2(m в степени), превосходящее N.
- Паскаль. Дано натуральное n. Вычислить используя цикл с постусловием + алгоритм
- Паскаль. Дано натуральное число. Верно ли , что цифра А встречается в нем более К раз.
- паскаль - Дано натуральное число п. Переставить его цифры так, чтобы образовалось наименьшее число
- помогите написать програму в паскале. Задано натуральное число х. вывести все двознначные числа ,сума которых меньше х.
- помогите написать программу на паскаль Заданное натуральное число не превосходящее 1000 записать прописью, то есть выве
- Помогите решить на ПАСКАЛЕ!Увеличить четные числа массива размера N,на исходное значение первого четного числа.
- Задан массив размером 30 элементов. Подсчитать число и сумму положительных элементов в нем. В Паскале. через рандом чисел !
- Помогите составить прогу в паскале: А в степени N, чтобы высчитывала ответ при вводе числа и её степени.Заранее спасиб
- Как в паскале убрать у числа определенно количество знаков после запятой?