[ peromalosutra @ 20.06.2005. 21:42 ] @
Pokusao sam da napravim program koji treba do pomnozi brojeve sa mnogo cifara (za sada do 1000). Tu sam naisao na 2 problema:
1. Zapis tako velikog broja u datoteci bi trebao biti neki niz byta koji ima clanova koliko i broj cifara. Tu onda nastaje problem oko ucitavanja.
2. Program koji sam ja napisao za sada moze da mnozi samo brojeve koji imaju isti broj cifara.
Evo mog koda:
Code:

program mnozenje;
uses wincrt;
var a,b,p:array[1..2000] of byte;
    i,j:integer;
    buffer:text;

function pomnozi (n:integer):integer;
begin
pomnozi:=a[n]*b[n] mod 10+ a[n]*b[n] div 10;
end;

begin
assign (buffer,'input');
reset (buffer);
i:=0;
while not EOLN (buffer) do
      begin
      inc(i,1);
      read (a[i]);
      end;
readln (buffer);
i:=0;
while not EOLN (buffer) do
      begin
      inc (i,1);
      read (b[i]);
      end;
close (buffer);
for j:=i downto 1 do
    p[j]:=pomnozi (j);
assign (buffer,'output');
rewrite (buffer);
for j:=1 to i do
    write (p[j]);
close (buffer);
end.


Na koji nacin se onda rjesavaju zadaci ovakvog tipa?
[ peromalosutra @ 20.06.2005. 21:44 ] @
Sada sam uocio gresku u kodu. Funkcija pomnozi bi trebala da izgleda ovako:
Code:

function pomnozi (n:integer):integer;
begin
pomnozi:=a[n]*b[n] mod 10+ a[n+1]*b[n+1] div 10;
end;
[ cassey @ 21.06.2005. 00:44 ] @
Pa jednostavno, radis isto kao i kada rucno mnozis brojeve... Evo pogledaj kod koji sam prilozio...

Code:

 procedure Mnozi (a, b: TNiz; var c: TNiz);
  var
         p, i, j, tmp: LongInt;
  begin
    FillChar (c, SizeOf (c), 0);
      c[0] := a[0] + b[0];
    for i := 1  to b[0] do begin
        tmp := 0;
      for j := 1 to a[0] do begin
          p := c[j + i - 1] + a[j] * b[i] + tmp;
        c[j + i - 1] := p MOD 10;
        tmp := p DIV 10;
        if (j = a[0]) then c[i + j] := tmp;
      end;
    end;
   while (c[c[0]] = 0) and (c[0] > 1) do Dec (c[0]);
  end;


Mnoze se brojevi cije su cifre zapamcenje u nizovima a i b, gde a [0] i b [0 ] predstavljaju broj cifara broja a i broja b. Rezultat se smesta u niz c, gde opet c [0] predstavlja broj cifara broja c.
[ cassey @ 21.06.2005. 00:45 ] @
Da, evo (ukoliko ti nesto znaci) i za sabiranje dva broja (ista prezentacija kao i kod mnozenja)

Code:

  procedure Saberi (a, b: TNiz; var c: TNiz);
  var
         p, i, j, tmp: LongInt;
  begin
    FillChar (c, SizeOf (c), 0);
      if a[0] > b[0] then c[0] := a[0] + 1
        else c[0] := b[0] + 1;
      tmp := 0;
    for i := 1  to c[0] do begin
        c[i] := (a[i] + b[i] + tmp) MOD 10;
      tmp :=  (a[i] + b[i] + tmp) DIV 10;
    end;
    while (c[c[0]] = 0) and (c[0] > 1) do Dec (c[0]);
  end;

[ bancika @ 21.06.2005. 18:25 ] @
zar nije malo neracionalno cuvati jednu cifru u jednom kad mozes dobiti oko 3 cifre svakim bajtom ako broj predstavis binarno, a ne u bcd