Заданы две строки шестнадцатеричных символом (в символьной форме). Разработать программу определения частного и остатка при делении первого
Условие Задачи:
Заданы две строки шестнадцатеричных символом (в символьной форме). Разработать программу определения частного и остатка при делении первого длинного числа на второе. Частное и остаток с шестнадцатеричными символами.
program PascalGuru;
{funkciya dlya preobrazovaniya chisla v stroku} function roundex(x:real;k:integer):string; var i:integer; s:string; begin Str(x:1:k,S);{preobrazovanie v stroku s zadannim kol-vom znakov} roundex:=s; end;
{funkciya dlya polucheniya zadannoy stepeni chisla} function potens(x , e :longint): real; var i : longint; p : real; begin p := 1; if e = 0 then p := 1 else{0-vaya stepen} if e < 0 then{esli otricatelnaya stepen} begin for i := -1 downto e do p := p / x; end else begin for i := 1 to e do p := p * x; {vozvedenie v stepen} end; potens:=p; end;
{funkciya dlya polucheniya nomera cifri} function digt(ch: char): byte; const numstring: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var i: byte; n: byte; begin n := 0; for i := 1 to length(numstring) do{poisk simvola} if ch = numstring[i] then n := i - 1; digt := n;{vozvrat nomera} end;
{preobrazovanie iz desyatichnoy v zadannyu sistemu} function dec2basen(base: integer; dec: real; nd:integer): string; const numstring: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var num : string; i, j: integer; c : longint; r: real; snum:string; begin if (dec = 0) or (base <2) or (base >36) then num := '0' else begin num := ''; i := 0; c:=trunc(dec); r:=dec-c; while potens(base, i + 1) <= c do i := i + 1;{vozvedenie v naivishuy stepen} for j := 0 to i do begin {nakoplenie chisla} num := num + numstring[(c div trunc(potens(base, i - j))) + 1]; c := c mod trunc(potens(base, i - j)); end; end; if (nd <> 0) then{drobnaya chast} begin num:=num+'.';{tochka} for j:=1 to nd do begin r:=r*base; {nakoplenie drobnoy chasti} num := num + numstring[trunc® + 1]; r:=r-trunc®; end; end; dec2basen := num; end;
{preobrazovanie iz zadannoy sistemu v desyatichnuy} function basen2dec(base: integer; num: string; nd:integer): string;
const numset: set of char = ['0'..'9', 'A'..'Z']; var j,t,k,len,point : integer; error: boolean; dec : real; begin dec := 0; error := false; if (base <2) or (base >36) then error := true;{esli netdopustimaya baza}
len:=length(num); point:=0; for j:=1 to length(num) do{poisk kol-vo znakov do tochki} if num[j] = '.' then begin len:=j-1; point:=j; break; end;
k:=0; for j := 1 to length(num) do if (num[j] <> '.') then begin k:=k+1; if (not (upcase(num[j]) in numset)) or (base < Digt(num[j]) + 1) then error:= true; {nakoplenie chisla} dec := dec + digt(upcase(num[j])) * potens(base, len - k); end; {esli korretno vozvrashaem chislo} if error then basen2dec := '0' else basen2dec := roundex(dec,nd); end;
{perevod chisel iz 16 v 10 sistemy schisleniya} t:=basen2dec(s1,s16one,2*0); val(t,tmp,code); t2:=dec2basen(s2,tmp,0); val(t2,des1,code); {des1 = 1 введенное число в 10-ой системе счисления }
t:=basen2dec(s1,s16two,2*0); val(t,tmp,code); t2:=dec2basen(s2,tmp,0); val(t2,des2,code); {des2 = 2 введенное число в 10-ой системе счисления }
{vychislyaem rezul'taty:} r1:=des1 div des2; {chastnoe} r2:=des1 mod des2; {ostatok}
{perevod chisel obratno iz 10 v 16 sistemy schisleniya} s1:=10; {iz kakoi} s2:=16; {v kakuyu}