Показать сообщение отдельно
  #3  
Старый 23.06.2011, 23:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Во.

Код:
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;

Код немного страшный, зато работает.
Ответить с цитированием