Dzielenie liczb zapisanych jako ciąg znaków string

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.

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. 
0

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

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

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.

0
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ę.

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

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

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

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?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0