optymalne mnożenie macierzy z C++ na Delphi

0

Mam mały problem z przepisaniem kodu z c++ na delphi. Znalazłem na necie taki kod: http://www-users.mat.uni.torun.pl/~lciesla/_private/algorytmy/omm.htm

i przepisałem go na:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label2: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    Label1: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure drukuj(pocz:integer;kon:integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a:array[0..100,0..100] of integer;

implementation

{$R *.dfm}
procedure TForm1.drukuj(pocz:integer;kon:integer);
begin
  if pocz=kon then
    begin
      edit1.Text:=edit1.Text+'M['+inttostr(pocz+1)+']';
    end
  else
    begin
      edit1.Text:=edit1.Text+'(';
      drukuj(pocz,pocz+a[kon][pocz]);
      edit1.Text:=edit1.Text+')*(';
      drukuj(pocz+a[kon][pocz]+1,kon);
      edit1.Text:=edit1.Text+')';
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,l,n,r:integer;
w:array[0..100] of integer;
k:array[0..100] of integer;
begin
edit1.Text:='';
n:=8;
w[0]:=2;
k[0]:=4;
w[1]:=4;
k[1]:=8;
w[2]:=8;
k[2]:=2;
w[3]:=2;
k[3]:=3;
w[4]:=3;
k[4]:=5;
w[5]:=5;
k[5]:=4;
w[6]:=4;
k[6]:=6;
w[7]:=6;
k[7]:=8;

 for i:=0 to n-1 do
  a[i][i]:=0;


 for i:=1 to n-1 do
   begin

     for j:=0 to n-i-1 do
       begin

         a[j][i+j]:=-1;
         for l:=0 to i-1 do
         begin
            r:=a[j][j+l]+a[j+l+1][i+j]+w[j]*k[j+l]*k[i+j];

            if (r < a[j][i+j])=false then
              begin
                a[j][i+j]:=r;
                a[i+j][j]:=l;

              end;

         end;

       end;

   end;
   label3.Caption:='Ilość operacji: '+inttostr(a[0][n-1]);
   drukuj(0,n-1);
end;

end.

k to ilość kolumn a w to ilość wierszy. Do testów użyłem ciagu ośmiu macierzy. Oba kody które wydają mi się takie same w działaniu wyliczją inne nawiasowanie i ilość operacji. Co tu może być nie tak?

Kod w c++ daje
operacji: 306
((((((M[1])((M[2])(M[3])))(M[4]))(M[5]))(M[6]))(M[7]))*(M[8])

a w delphi:
operacji: 1232
(M[1])((M[2])(((((M[3])(M[4]))(M[5]))((M[6])(M[7])))*(M[8])))

0

Witam
Z tego co zauważyłem na początek to:
w Pascalu masz

if (r < a[j][i+j])=false then  // wchodzisz  jezeli r >
   begin
       a[j][i+j]:=r;
       a[i+j][j]:=l;
   end;

a w c

 if (r<a[j][i+j])   /* wchodzisz jezeli r < */
  {
     a[j][i+j]=r;
     a[i+j][j]=l;
   }

i przydałby się cały twój kod w c++, którym generujesz ten wynik moze tam też coś jest nie tak.

Pozdrawiam Grzegorz

1 użytkowników online, w tym zalogowanych: 0, gości: 1