Dzielenie liczb zapisanych jako ciąg znaków string

Dzielenie liczb zapisanych jako ciąg znaków string
A6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Witajcie. Problem polega na napisaniu programu który dzieli liczby zapisane jako ciąg(string). Np. wrowadzamy 122394823058439( max do 100znaków) i drugi ciąg przez który dzielimy (np 1232534989), obie liczby są zapisane jako typ string. Póki co mam takie coś, ale gdzieś jest błąd. Może ma ktoś jakieś sugestie? Z góry dzięki za pomoc.

Kopiuj
Program string;
uses crt;

var
s1,s2: string;
i,j: integer;
v1,v2,v3,v4: longint;
c: char;

Procedure Dzielenie;
begin
 v3:=v1 div v2;
 v1:=v1-(v3*v2);
 v1:=v1*10;
end;

Procedure WczytajZmienne;
begin
 clrscr;
 writeln('Pierwszy string:');
 readln(s1);
 writeln('Drugi string:');
 readln(s2);
 clrscr;
 for i:=1 to length(s1) do
  v1:=v1*10+ord(s1[i]);
 for i:=1 to length(s2) do
  v2:=v2*10+ord(s2[i]);
 writeln('Twoj wynik to:');
 for i:=1 to j do
  begin
   Dzielenie;
   write(abs(v3));
   if i=1 then write(',');
  end;
 readkey;
end;

Procedure LiczbyPo;
begin
 clrscr;
 writeln('Ile chcesz liczb po przecinku?');
 readln(j);
end;

procedure Menu;
 begin
  clrscr;
  c:=' ';
  v1:=0;
  v2:=0;
  v3:=0;
  writeln('1. Wykonaj dzielenie');
  writeln('2. Zmien ilosc liczb po przeciknu --> ',j);
  writeln('0. Wyjdz');
  c:=readkey;
  case c of
   '1': WczytajZmienne;
   '2': LiczbyPo;
  end;
 end;

begin
 j:=10;
 c:=' ';
 while (c<>'0') and (ord(c)<>27) do
  begin
   Menu;
  end;
end. 
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Póki co mam takie coś, ale gdzieś jest błąd.

Pierwsza myśl: użyj debuggera i podglądu zmiennych.

payl
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 196
0

Ja się dołączam do Patryka27, ale dodatko radzę się nauczyć pisać proceduralnie, bo to co dałeś jest nieczytelne. Na dodatek jedziesz tylko na zmiennych globalnych, powinni za to obcinać ręce.

SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0
Kopiuj
Program string;

Nazwą programu nie może być string, bo to jest słowo kluczowe i jako takie jest zastrzeżone, tzn. nie może być zdefiniowane przez programistę.

Kopiuj
for i:= 1 to length(s1) do v1:= v1*10+ord(s1[i]);

Jeżeli chcesz w ten sposób zamienić łańcuch znakowy na liczbę, to jeszcze musisz odejmować 48. Kod będzie wyglądał tak (mam nadzieję, że się domyślisz dlaczego). Oczywiście to samo dotyczy zmiennej s2

Kopiuj
for i:= 1 to length(s1) do v1:= v1*10+ord(s1[i])-48;

Aby otrzymać **n **miejsc po przecinku, pętla musi być do n+1, więc odpowiedni fragment procedury WczytajZmienne będzie taki

Kopiuj
for i:= 1 to j+1 do

Jak to poprawisz, to program będzie obliczał poprawnie iloraz wprowadzonych liczb. Jest jednak małe ale.

Abaddon664 napisał(a)

Np. wprowadzamy 122394823058439 (max do 100 znaków)

Niestety, ale dla takich dużych liczb ten sposób nie zadziała. Arytmetyka dużych liczb (w szczególności dzielenie) jest trochę bardziej skomplikowana. Twój algorytm zadziała tylko dla liczb, które mieszczą się w zakresie Longint

A6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Dzięki za wszelkie sugestie. Czy metoda dzielenia pisemnego sprawdzi się w tym przypadku? Może jest jakiś inny sprawdzony sposób na dzielenie tak dużych liczb?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.