Другие языки программирования и технологии

Паскаль. Представить натуральное число n в виде суммы трёх квадратов натуральных чисел.

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));)
Можно и без вычисления корня, хотя это будет кривовато и неэффективно, но если заметить 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) поэтому цикл всё же будет.
Никита =^_^=
Никита =^_^=
11 112
Лучший ответ
Можно в for'е вместо Lj сам N(или Round(N/2), где-то так) верхней границей указать. Но быстрее работать будет, как правило, с корнем. А писали вы?
РД
Радик Джан
22 178

Похожие вопросы