Программа
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.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию