![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Уважаемые форумчане-очень нужна ваша помощь в решении задачи по информатике(язык програмирования Delphi7).Задача состоит в следующем :найти минимальное число,которое представляется сумой 4 квадратов натуральных чисел не единственным образом!если несложно-покажите полный код программы.Заранее благодарен.
|
|
#2
|
|||
|
|||
|
Полный код показать сложно, бо как готового нету.
Так что пробуем сами, выкладываем свои наработки и спрашиваем то, что не получается. Задача переборная, т.е. просто надо делать перебор всех вариантов. На первый взгляд - там 5 вложенных циклов: 4 для чисел и пятый для проверок. Когда вычисляешь результат, то его надо записывать в какой-нить массив, включая все исходные числа. Если такое число уже есть и исходные цифры, из которых оно образовалось, не совпадают - то вот твой ответ. Как построит циклы - подумай. |
|
#3
|
|||
|
|||
|
Во.
Код:
type
TResultSet = record
Number : Integer;
Src : Array [0..3] Of Integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Buf : TResultSet;
AResultSet : Array Of TResultSet;
S1, S2, S3, S4 : Integer;
Iter : Integer;
I, J : Integer;
bFound : Boolean;
iBuf : Integer;
begin
SetLength(AResultSet,0);
Iter := 0;
S1 := 1;
While True Do
Begin
For S2 := 1 To S1 Do
For S3 := 1 To S1 Do
For S4 := 1 To S1 Do
Begin
Buf.Number := sqr(S1) + sqr(S2) + sqr(S3) + sqr(S4);
Buf.Src[0] := S1;
Buf.Src[1] := S2;
Buf.Src[2] := S3;
Buf.Src[3] := S4;
For I := 0 To 2 Do
For J := I+1 To 3 Do
If Buf.Src[i] > Buf.Src[J] Then
Begin
iBuf := Buf.Src[i];
Buf.Src[i] := Buf.Src[J];
Buf.Src[J] := iBuf;
End;
bFound := False;
For I := Low(AResultSet) To High(AResultSet) Do
If (Buf.Number = AResultSet[i].Number) And
((Buf.Src[0] <> AResultSet[i].Src[0]) Or
(Buf.Src[1] <> AResultSet[i].Src[1]) Or
(Buf.Src[2] <> AResultSet[i].Src[2]) Or
(Buf.Src[3] <> AResultSet[i].Src[3]))
Then
Begin
ShowMessage(Format('Found:'#13#10'1: %d = %d + %d + %d + %d'#13#10'2: %d = %d + %d + %d + %d',
[AResultSet[i].Number,AResultSet[i].Src[0],AResultSet[i].Src[1],AResultSet[i].Src[2],AResultSet[i].Src[3],
Buf.Number,Buf.Src[0],Buf.Src[1],Buf.Src[2],Buf.Src[3]]));
Exit;
End
Else
If (Buf.Number = AResultSet[i].Number) Then
Begin
bFound := True;
Break;
End;
If Not bFound Then
Begin
SetLength(AResultSet,Length(AResultSet)+1);
AresultSet[High(AResultSet)] := Buf;
End;
End;
Inc(S1);
Inc(Iter);
If Iter > 1000 Then
Begin
ShowMessage('Not found.');
Exit;
End;
End;
end;Код немного страшный, зато работает. |
|
#4
|
||||
|
||||
|
Какая тема будет следующей?
найти минимальное число,которое представляется сумой 8 квадратов натуральных чисел? Посмотрел ради интереса в гугле: полно теории, рефератов, примеров решения, теорем и т.д. ТС не удосужился даже в гугль зайти ![]() |
|
#5
|
|||
|
|||
|
Да мне было просто интересно саму программу написать.
Задачка довольно интересная. Хотя, догадываюсь, что решение мягко говоря не оптимальное. |