Программа


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.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию