Iloczyn duzych liczb w Pascalu.

Tom444
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 9 lip 2007, o 12:33
Płeć: Mężczyzna
Lokalizacja: Wawa
Podziękował: 1 raz

Iloczyn duzych liczb w Pascalu.

Post autor: Tom444 »

Witam:)mam takie zadanie:
Dane są dwa napisy S1 oraz S2 zawierające zapis dużych liczb naturalnych (liczby mogą
mieć długość do 100 cyfr). Zdefiniuj funkcję Iloczyn, która zwróci w postaci napisu iloczyn
tych liczb. Należy pamiętać, że zamiana napisów na jakikolwiek typ całkowity zakończy się
błędem, gdyż wartości liczb nie mieszczą się w żadnym standardowym typie języka. Napisz
program, służący do obliczania takich iloczynów i korzystający z tej funkcji.

I jeszcze mam pytanie jak się zamienia ciag cyfr typu string na jakiś inny liczbowy typ?
Xfly
Użytkownik
Użytkownik
Posty: 174
Rejestracja: 13 mar 2006, o 20:44
Płeć: Mężczyzna
Lokalizacja: Nowogard
Podziękował: 33 razy
Pomógł: 10 razy

Iloczyn duzych liczb w Pascalu.

Post autor: Xfly »

Hmm nie wiem jak w Pascalu ale w innych językach nazywa się to rzutowaniem "casting", choć nie zawsze jest to operacja bezpieczna i pożądana.
Awatar użytkownika
Plant
Użytkownik
Użytkownik
Posty: 331
Rejestracja: 16 sty 2006, o 21:30
Płeć: Mężczyzna
Lokalizacja: Grudziadz/Warszawa
Pomógł: 70 razy

Iloczyn duzych liczb w Pascalu.

Post autor: Plant »

Hm.. możnaby zrobić algorytm działający na podobę mnożenia pisemnego..

[ Dodano: 9 Lipca 2007, 17:09 ]
StrToInt - zamiana ze String na Integer;
IntToStr - zamiana z Integer na String;
StrToFloat - zamiana ze String na Float (Real);
FloatToStr..
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

Iloczyn duzych liczb w Pascalu.

Post autor: smiechowiec »

W turbo Pascal 5.5 który jest darmowy do konwersji ciągu znaków na liczbę jest
funkcja val(ciag_znakowy, kod_bledu, liczba);

Kod: Zaznacz cały

Program Duze_Liczby_Calkowite;

var
  senter : String;
  s1, s2 : String;

{ --------------------------------------------------------------------------
  Funkcja wartosc zwraca liczbe całkowita reprezentowana przez znak cyfry.
  Dzialanie oparte jest na wlasnosci kodu ASCII, dla ktorego wartosc cyfry
  jest powiekszona o 48, np kod dla 0 równa 40, dla 1 wynosi 49...
  -------------------------------------------------------------------------- }
function wartosc(c : char) : integer;
begin
  wartosc := ord(c) - 48;
end;

{ --------------------------------------------------------------------------
  Funkcja odwrotna do funkcji wartosc.
  Zwraca znak ASCII dla podanej liczby (cyfry)
  np dla cyfry 0 zwraca 48, dla 1 zwraca 49.
  -------------------------------------------------------------------------- }
function znak(i : integer) : char;
begin
  znak := char(i + 48);
end;

{ --------------------------------------------------------------------------
  Procedura wypelniajaca ciag znakow podanym znakiem tyle razy ile jest podane
  w parametrze ile. Jest to odpowiednik prcocedury FillChar, ktora wymaga
  dodatkowo operacji na zerowym elemencie lancucha co jest niekompatypilne
  z nowszymi wersjami delphi.
 -------------------------------------------------------------------------- }
procedure wypelnij(var s : string; ile : Integer; znak : char);
var
  i : Integer;
begin
  s := '';
  for i := 1 to ile do
    s := s + znak;
end;

{ --------------------------------------------------------------------------
  Funkcja zwraca ciąg znakowy bedacy suma liczb podanych jako parametry wejsciowe s1 i s2.
  Istota dzialania opiera sie na pisemnym dodawnaniu liczb.
  Na poczatku uzupelniamy krotszy ciag zerami z przodu, aby oba ciagi mialy identyczna dlugosc.
  Dodajemy kolejne cyfry, zaczynajac od jednosci, podczas dodawania
  uwzgledniamy wartosc przeniesienia w zmiennej iprze.
  -------------------------------------------------------------------------- }
function suma(s1 : String; s2 : String) : String;
var
  swynik, spom : String;
  i, iwynik, iprze, idl : Integer;
begin
  spom := '';
  if (length(s1) > length(s2)) then
  begin
    idl := length(s1);
    if (length(s2) < idl) then begin
      wypelnij(spom, idl - length(s2), '0');
      s2 := spom + s2;
    end;
  end
  else begin
    idl := length(s2);
    if (length(s1) < idl) then begin
      wypelnij(spom, idl - length(s1), '0');
      s1 := spom + s1;
    end;
  end;
  swynik := '';
  iprze := 0;
  for i := idl downto 1 do begin
    iwynik := wartosc(s1[i]) + wartosc(s2[i]) + iprze;
    iprze  := iwynik div 10;
    iwynik := iwynik mod 10;
    swynik := znak(iwynik) + swynik;
  end;
  if (iprze > 0) then
    swynik := znak(iprze) + swynik;
  suma := swynik;
end;

{ --------------------------------------------------------------------------
  Funkcja zwraca ciąg znakowy bedacy iloczynem liczb podanych jako parametry wejsciowe s1 i s2.
  Istota dzialania opiera sie na pisemnym mnozeniu liczb.
  Korzystamy z faktu ze mnozenie to wielokrotne dodawanie.
  Licznikiem ilosci dodawan jest wartosc zawarta w s1, natomiast w petli dodajemy
  wartosc liczby zawartej w ciagu s2.
  Wymnazamy po kolei przez wszytskie cyfry zawarte w s1 uzupelniajac wynik odpowiednia iloscia zer
  w zaleznosi od pozycji cyfry.
  -------------------------------------------------------------------------- }
function iloczyn(s1 : string; s2 : string) : string;
var
  i, j : Integer;
  spom, sil : String;
  swynik : String;
begin
  swynik := '0';
  for i := length(s1) downto 1 do begin
    wypelnij(spom, length(s1) - i, '0');
    sil := '0';
    for j := 1 to wartosc(s1[i]) do begin
      sil := suma(sil, s2);
    end;
    sil := sil + spom;
    swynik := suma(swynik, sil)
  end;
  iloczyn := swynik;
end;

begin
  WriteLn('Program mnozy dwie liczby calkowite a x b = iloczyn');
  Write('Podaj a = '); ReadLn(s1);
  Write('podaj b = '); ReadLn(s2);
  Writeln('Iloczyn ', s1 , ' x ', s2 , ' = ', iloczyn(s1, s2));
  Writeln('Nacisnij Enter, aby zakonczyc program');
  ReadLn(senter);
end.
Tom444
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 9 lip 2007, o 12:33
Płeć: Mężczyzna
Lokalizacja: Wawa
Podziękował: 1 raz

Iloczyn duzych liczb w Pascalu.

Post autor: Tom444 »

Świetnie:)) wszystko działa poprawnie. Jeszcze muszę to przetrawić ;]

[ Dodano: 11 Lipca 2007, 12:00 ]
Hmm.. A mam jeszcze problem. Mam taką procedurę, która ma za zadanie wyzerować tablice:
Procedure Zeruj(Var L : Liczba);
Var
I : Byte;
Begin
For I:=1 To 100 Do L:=0;
End;

I teraz jak ja wstawic do programu.Właściwie chodzi o to gdzie mam zdefiniować tablice L ? I jeszcze do tego musze zdefiniować typ tej tablicy: Liczba.
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

Iloczyn duzych liczb w Pascalu.

Post autor: smiechowiec »

Rozumiem, ze to problem nie związany z poprzednim zagadnieniem ?

Kod: Zaznacz cały

Program zerowanie;

type
  Liczba = Array[1..100] of Integer;

var
  L : Liczba;
  I : Byte;

Procedure Zeruj(Var L : Liczba);
Var
  I : Byte;
Begin
  For I := 1 To 100 Do L[I] := 0;
End;

begin
  Zeruj(L);
  { wypisanie tablicy }
  For I := 1 To 100 Do
    WriteLn(I, , L[i]);
end.
ODPOWIEDZ