Программа


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,         ATest,
    bj,bEnd,SqrB,         BTest,
    C,                    CTest       :integer;
    T,T2: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;
  for ATest:=1 to TruncSqrt(32767) do
    for BTest:=1 to TruncSqrt(32767-Sqr(ATest)) do
      for CTest:=1 to TruncSqrt(32767-Sqr(ATest)-Sqr(BTest)) do
         if Sqr(ATest)+Sqr(BTest)+Sqr(CTest)<=32767 then
           begin
             Writeln;
             Write('Введите N '); N:=Sqr(ATest)+Sqr(BTest)+Sqr(CTest);
             Writeln(N,'=',ATest,'^2+',BTest,'^2+',CTest,'^2');
             T:=false;
             T2:=false;
             aEnd:=TruncSqrt(N div 3);
             for ai:=1 to aEnd do
               Begin
                 SqrA:=Sqr(ai);
                 bEnd:=TruncSqrt((N-Sqr(ai)) 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
                           GoToXY(1,WhereY);
                           ClrEol;
                           Write(ai,' ',bj,' ',C,'  ',SqrA+SqrB+Sqr(C));
                           if (ai=ATest) and (bj=BTest) and (C=CTest) then
                             begin
                               Write('  ',ATest,' ',BTest,
                                      ' ',CTest,'     OK');
                               if T2 then begin
                                            GoToXY(WhereX-2,WhereY);
                                            Write('BAD  Второй вариант !!! ');
                                            if ReadKey='' then
                                          end;
                               T2:=true
                             end;
                           writeln;
                           T:=true;
                         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 Begin
                             Writeln('Разложить не удалось !!! ');
                             if ReadKey='' then
                           End
           end
END.


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