Программа
Program Pilshikov_5_32 (input,output);
{ Вычислить возможность представления
натурального N в виде суммы трех
полных квадратов }
{ Дополнение: поиск разложений }
{
Концепция:
1) Наити все полные квадраты - a1..aK из [1..Sqrt(N/3)]
2) Найти для каждого ai все полные квадраты - b1..bL из [ai..Sqrt((N-ai)/2)]
3) Проверить для каждой пары (ai,bj) является ли полным квадратом N-ai-bj
}
Uses Crt;
Var N,
ai,aEnd,SqrA,
bj,bEnd,SqrB,
C:integer;
T:boolean;
Function TruncSqrt(a:integer):integer;
var TrSc,SqrTrSc,
L,LPred,
R,RPred:integer;
Begin
if (a>1) and (a<32761)
then begin
L:=1; LPred:=0;
R:=a div 2; RPred:=R+1;
while (L<>LPred) or (R<>RPred) do
begin
LPred:=L; RPred:=R;
TrSc:=L+(R-L) div 2;
if TrSc>181 then SqrTrSc:=32761
else SqrTrSc:=Sqr(TrSc);
if SqrTrSc>a then R:=TrSc
else L:=TrSc
end;
while Sqr(R)>a do R:=R-1;
TruncSqrt:=R
end
else if a>32760 then TruncSqrt:=181
else if a<0 then TruncSqrt:=1 div (a-a)
else TruncSqrt:=a
End;
BEGIN
Writeln;
Write('Введите N '); Readln(N);
T:=false;
aEnd:=TruncSqrt(N div 3);
for ai:=1 to aEnd do
Begin
SqrA:=Sqr(ai);
bEnd:=TruncSqrt((N-SqrA) div 2);
for bj:=ai to bEnd do
begin
SqrB:=Sqr(bj);
C:=TruncSqrt(N-SqrA-SqrB);
if SqrA+SqrB+Sqr(C)=N
then begin
T:=true;
GoToXY(1,WhereY);
ClrEol;
Writeln(ai,'^2+',bj,'^2+',C,'^2=',SqrA+SqrB+Sqr(C))
end
else begin
GoToXY(1,WhereY);
Write(' A[1..',aEnd,']=',ai,
' B[',ai,'..',bEnd,']=',bj,
' C=',C);
ClrEol
end
end
End;
GoToXY(1,WhereY);
ClrEol;
if not T then Writeln('Разложить не удалось ')
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию