[ atlas @ 26.04.2004. 22:30 ] @
Kako napraviti u PASCALU program da prepoznaje brojeve vece od onih kojih nam on dozvoljava??
primjer;

treba mi program koji traži da unesemo dva broja sa 6 cifara i da napiše njihov zbir i proizvod?

[Ovu poruku je menjao -zombie- dana 27.04.2004. u 18:18 GMT]
[ reiser @ 26.04.2004. 23:25 ] @
Pa stavi broj kao LongInt.
[ atlas @ 27.04.2004. 08:44 ] @
Ne moze preko tipa LONGINT.
Skoro je bilo na takmicenju,kazu da se moze uraditi.
VJEROVATNO POSTOJI NEKA CAKA..
mozda nekako preko brojnih stringova
[ Sasa A @ 27.04.2004. 08:49 ] @
Mozes da koristis nizove, dakle svaka cifra jedan clan niza ili da koristis liste
[ srki @ 27.04.2004. 13:57 ] @
Evo ja cu da ti dam ideju pa ti uradi nesto a mi cemo da ispravimo greske.
Definisi a,b,c i d kao longint. Ucitaj prva dva broja u neka dva stringa.
Prva 3 karaktera u prvom stringu pretvori u broj i smesti u a. druga 3 karaktera pretvori u broj i smesti u b (imas funkcije za to, ne secam se imena funkcija davno sam se igrao sa Pascalom).
Isto tako uradi sa drugim brojem i smeti odgovarajuce brojeve u c i d.
Sada uradi ovo:
poslednje3cifre:=b*d mod 1000;
pretposlednje3cifre:=(b*d div 1000) + ((a*d+b*c) mod 1000);
prvih6cifara:=a*c+ ((a*d+b*c) div 1000);
Write(prvih6cifara:6, pretposlednje3cifre:3, poslednje3cifre:3);

To resenje se dobija iz sledece formule:
(a*10000+b)*(c*10000+d)=a*c*1000*1000+a*d*1000+b*c*1000+b*d

To ti je resenje za mnozenje a za sabiranje ne moras da izvodis nikakve formule nego samo pretvori prva 2 stringa u longintove i saberi ih.
[ Bojan Kopanja @ 27.04.2004. 19:31 ] @
Ako ne moze longint, moze li extended? Sa ovim tipom mozes da vrsis operacije i samnoooooogo vecim brojevima od onih sa sest cifaraa ...

p0z.
[ Bojan Kopanja @ 27.04.2004. 19:35 ] @
Citat:
srki:
Evo ja cu da ti dam ideju pa ti uradi nesto a mi cemo da ispravimo greske.
Definisi a,b,c i d kao longint. Ucitaj prva dva broja u neka dva stringa.
Prva 3 karaktera u prvom stringu pretvori u broj i smesti u a. druga 3 karaktera pretvori u broj i smesti u b (imas funkcije za to, ne secam se imena funkcija davno sam se igrao sa Pascalom).
Isto tako uradi sa drugim brojem i smeti odgovarajuce brojeve u c i d.
Sada uradi ovo:
poslednje3cifre:=b*d mod 1000;
pretposlednje3cifre:=(b*d div 1000) + ((a*d+b*c) mod 1000);
prvih6cifara:=a*c+ ((a*d+b*c) div 1000);
Write(prvih6cifara:6, pretposlednje3cifre:3, poslednje3cifre:3);

To resenje se dobija iz sledece formule:
(a*10000+b)*(c*10000+d)=a*c*1000*1000+a*d*1000+b*c*1000+b*d

To ti je resenje za mnozenje a za sabiranje ne moras da izvodis nikakve formule nego samo pretvori prva 2 stringa u longintove i saberi ih.


Eh, da... ovo me pomalo podseca na mnozenje u dvostrukoj preciznosti koje se "povlaci" jos od asemblera ...
[ bancika @ 28.04.2004. 13:00 ] @
ucitavaj direktno u niz cifara, i to u inverznom redosledu tako da cifra najvece tezine bude skroz desno. tako ti je lakse da uradis ako imas prenos cifara, da ne shiftas cifre. ne moras cak nigde da koristis (long) integer. aj ako me ne mrzi poslacu ti source u toku dana...
pozdravi
[ bancika @ 28.04.2004. 14:18 ] @
evo ti kod. napisao sam u delphi, al ako ne umes da prebacis onda bem li ga :)

Code:

program Mnozenje;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var A, B, C, D: string;
    Action: char;

function Vrednost(c: char): byte;
begin
  Result := Ord(c) - 48;
end;

procedure Saberi(A, B: string; var C: string);
var p, i: byte;
begin
  //da se izjednace duzine A, B i C
  while Length(A) > Length(B) do
    B := '0' + B;
  while Length(A) < Length(B) do
    A := '0' + A;
  SetLength(C, Length(A));

  //sabiranje cifra po cifra
  p := 0;
  for i := Length(A) downto 1 do
   begin
     C[i] := Chr((p + Vrednost(A[i]) + Vrednost(B[i])) mod 10 + 48);
     p := (p + Vrednost(A[i]) + Vrednost(B[i])) div 10;
   end;

  //ako ima prenos dodati na pocetak
  if p > 0 then
   C := Chr(p + 48) + C;
end;

procedure Mnozi(A, B: string; var C: string);
var i, j, p: byte;
    temp: char;
begin
  //da se izjednace duzine A, B i C i postaviti C na 0;
  while Length(A) > Length(B) do
    B := '0' + B;
  while Length(A) < Length(B) do
    A := '0' + A;
  SetLength(C, 2 * Length(A));
  for i := 1 to Length(C) do
   C[i] := '0';

  //mnozenje cifra po cifra
  p := 0;
  for i := Length(A) downto 1 do
   begin
     for j := Length(A) downto 1 do
       begin
         temp := Chr((p + Vrednost(C[i + j]) + Vrednost(A[i]) * Vrednost(B[j])) mod 10 + 48);
         p := (p + Vrednost(C[i + j]) + Vrednost(A[i]) * Vrednost(B[j])) div 10;
         C[i + j] := temp;
       end;
     //ako ima prenosa dodati na pocetak tekuceg sabirka
     if p > 0 then
      begin
        C[i] := Chr(p + 48);
        p := 0;
      end;
   end;

  //obrisati prve nule
  while C[1] = '0' do
    Delete(C, 1, 1);
end;

begin
  while True do
   begin
     Write('A = '); ReadLn(A);
     Write('B = '); ReadLn(B);
     WriteLn;
     Saberi(A, B, C);
     WriteLn('A + B = ', C);
     Mnozi(A, B, D);
     WriteLn('A * B = ', D);
     WriteLn(#13, 'Nastaviti? (D/N)');
     ReadLn(Action);
     if UpCase(Action) = 'N' then
      Break;
   end;
end.


pozdravi