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?
Iloczyn duzych liczb w Pascalu.
-
- 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.
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.
- Plant
- 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.
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..
[ 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..
-
- 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.
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);
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.
-
- 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.
Ś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:
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.
[ 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.
-
- 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.
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.