天梯 wikioi3118 高精度练习之除法
题目描述 Description
给出两个正整数A和B,计算A/B整数部分的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A/B整数部分的值
样例输入 Sample Input
15 5
样例输出 Sample Output
3
求代码,不要从文本里读取,是直接输入
Free pascal高精度除法
答案:3 悬赏:50 手机版
解决时间 2021-02-03 10:23
- 提问者网友:椧運幽默
- 2021-02-02 20:54
最佳答案
- 五星知识达人网友:神鬼未生
- 2021-02-02 21:04
type hp=array[-1..1000] of longint;
var
a,b,c,d:hp;
l1,l2,l3,i,code:longint;
n1,n2:string;
procedure init(var a:hp);
var
s:string;
i:longint;
begin
fillchar(a,sizeof(a),0);
readln(s);
a[0]:=length(s);
for i:=1 to a[0] do
a[i]:=ord(s[a[0]+1-i])-48;
end;
procedure print(a:hp);
var
i:longint;
begin
for i:=a[0] downto 1 do
write(a[i]);
writeln;
end;
procedure clear(var a:hp);
var
i:longint;
begin
for i:=1 to a[0] do
begin
inc(a[i+1],a[i] div 10);
a[i]:=a[i] mod 10;
end;
while (a[a[0]]=0) and (a[0]>1) do dec(a[0]);
end;
function compare(a,b:hp):longint;
var
i:longint;
begin
clear(a);
clear(b);
if a[0]>b[0] then begin compare:=1; exit; end;
if a[0]
for i:=a[0] downto 1 do
begin
if a[i]>b[i] then begin compare:=1; exit; end;
if a[i]
end;
compare:=0;
end;
procedure plus(a,b:hp;var c:hp);
var
i:longint;
begin
c:=a;
if b[0]>c[0] then c[0]:=b[0];
for i:=1 to b[0] do
inc(c[i],b[i]);
inc(c[0]);
clear(c);
end;
procedure minus(a,b:hp;var c:hp);
var
i:longint;
begin
if compare(a,b)<0 then
begin
c:=b;
b:=a;
end
else
c:=a;
for i:=1 to c[0] do
begin
dec(c[i+1]);
inc(c[i],10-b[i]);
end;
clear(c);
end;
procedure multiply(a,b:hp;var c:hp);
var
i,j:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to a[0] do
for j:=1 to b[0] do
inc(c[i+j-1],a[i]*b[j]);
c[0]:=a[0]+b[0];
clear(c);
end;
procedure divide(a,b:hp;var c,d:hp);
var
i,j,p:longint;
begin
fillchar(c,sizeof(c),0);
fillchar(d,sizeof(d),0);
c[0]:=a[0]; d[0]:=1;
for j:=a[0] downto 1 do
begin
inc(d[0]);
for p:=d[0] downto 2 do
d[p]:=d[p-1];
d[1]:=a[j];
while compare(d,b)>=0 do
begin
inc(c[j]);
minus(d,b,d);
end;
end;
clear(c);clear(d);
end;
begin
init(a);
init(b);
plus(a,b,c);
print(c);
minus(a,b,c);
print(c);
multiply(a,b,c);
print(c);
divide(a,b,c,d);
print(c);
print(d);
end.这里边包含了加减乘除模等高精度运算,lz稍加整理可作为模板使用
另:建议lz还是用C/C++,
我有C++版高精度+压位+重载运算符的完整模板,lz需要的话我可以发一份
var
a,b,c,d:hp;
l1,l2,l3,i,code:longint;
n1,n2:string;
procedure init(var a:hp);
var
s:string;
i:longint;
begin
fillchar(a,sizeof(a),0);
readln(s);
a[0]:=length(s);
for i:=1 to a[0] do
a[i]:=ord(s[a[0]+1-i])-48;
end;
procedure print(a:hp);
var
i:longint;
begin
for i:=a[0] downto 1 do
write(a[i]);
writeln;
end;
procedure clear(var a:hp);
var
i:longint;
begin
for i:=1 to a[0] do
begin
inc(a[i+1],a[i] div 10);
a[i]:=a[i] mod 10;
end;
while (a[a[0]]=0) and (a[0]>1) do dec(a[0]);
end;
function compare(a,b:hp):longint;
var
i:longint;
begin
clear(a);
clear(b);
if a[0]>b[0] then begin compare:=1; exit; end;
if a[0]
for i:=a[0] downto 1 do
begin
if a[i]>b[i] then begin compare:=1; exit; end;
if a[i]
end;
compare:=0;
end;
procedure plus(a,b:hp;var c:hp);
var
i:longint;
begin
c:=a;
if b[0]>c[0] then c[0]:=b[0];
for i:=1 to b[0] do
inc(c[i],b[i]);
inc(c[0]);
clear(c);
end;
procedure minus(a,b:hp;var c:hp);
var
i:longint;
begin
if compare(a,b)<0 then
begin
c:=b;
b:=a;
end
else
c:=a;
for i:=1 to c[0] do
begin
dec(c[i+1]);
inc(c[i],10-b[i]);
end;
clear(c);
end;
procedure multiply(a,b:hp;var c:hp);
var
i,j:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to a[0] do
for j:=1 to b[0] do
inc(c[i+j-1],a[i]*b[j]);
c[0]:=a[0]+b[0];
clear(c);
end;
procedure divide(a,b:hp;var c,d:hp);
var
i,j,p:longint;
begin
fillchar(c,sizeof(c),0);
fillchar(d,sizeof(d),0);
c[0]:=a[0]; d[0]:=1;
for j:=a[0] downto 1 do
begin
inc(d[0]);
for p:=d[0] downto 2 do
d[p]:=d[p-1];
d[1]:=a[j];
while compare(d,b)>=0 do
begin
inc(c[j]);
minus(d,b,d);
end;
end;
clear(c);clear(d);
end;
begin
init(a);
init(b);
plus(a,b,c);
print(c);
minus(a,b,c);
print(c);
multiply(a,b,c);
print(c);
divide(a,b,c,d);
print(c);
print(d);
end.这里边包含了加减乘除模等高精度运算,lz稍加整理可作为模板使用
另:建议lz还是用C/C++,
我有C++版高精度+压位+重载运算符的完整模板,lz需要的话我可以发一份
全部回答
- 1楼网友:野味小生
- 2021-02-02 21:57
vdvvvvvvvvvvv
- 2楼网友:酒醒三更
- 2021-02-02 21:19
procedure highdevide(a,b:hp; var c,d:hp); //高精度除法 高精度/高精度
var
i,len:integer;
begin
fillchar(c,sizeof(c),0);
fillchar(d,sizeof(d),0);
len:=a[0];d[0]:=1;
for i:=len downto 1 do begin
multiply(d,10,d);
d[1]:=a[i];
while(compare(d,b)>=0) do {即d>=b}
begin
Subtract(d,b,d);
inc(c[i]);
end;
end;
while(len>1)and(c.s[len]=0) do dec(len);
c.len:=len;
end;
hp为数组定义
type hp:array[1..max] of integer;
a[0],b[0],c[0],d[0]为数组的长度
再在主程序里打出来
如:for i:=x[0] downto 1 do write(x[i]);
write('.');
for i:=1 to y[0] do w...procedure highdevide(a,b:hp; var c,d:hp); //高精度除法 高精度/高精度
var
i,len:integer;
begin
fillchar(c,sizeof(c),0);
fillchar(d,sizeof(d),0);
len:=a[0];d[0]:=1;
for i:=len downto 1 do begin
multiply(d,10,d);
d[1]:=a[i];
while(compare(d,b)>=0) do {即d>=b}
begin
Subtract(d,b,d);
inc(c[i]);
end;
end;
while(len>1)and(c.s[len]=0) do dec(len);
c.len:=len;
end;
hp为数组定义
type hp:array[1..max] of integer;
a[0],b[0],c[0],d[0]为数组的长度
再在主程序里打出来
如:for i:=x[0] downto 1 do write(x[i]);
write('.');
for i:=1 to y[0] do write(y[i]);
writeln;
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯