2个回答
展开全部
高精度除以整型数据(integer);
程序如下:
program HighPrecision3_Multiply1;
const
fn_inp='hp5.inp';
fn_out='hp5.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x,y:hp;
z,w:integer;
procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s[i]);
end;
procedure init;
var
st:string;
i:integer;
begin
assign(input,fn_inp);
reset(input);
readln(st);
x.len:=length(st);
for i:=1 to x.len do { change string to HP }
x.s[i]:=ord(st[x.len+1-i])-ord('0');
readln(z);
close(input);
end;
procedure Divide(a:hp;b:integer;var c:hp;var d:integer);
{ c:=a div b ; d:=a mod b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
d:=0;
for i:=len downto 1 do { from high to low }
begin
d:=d*10+a.s[i];
c.s[i]:=d div b;
d:=d mod b;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;
procedure main;
begin
Divide(x,z,y,w);
end;
procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
writeln(w);
close(output);
end;
begin
init;
main;
out;
end.
程序如下:
program HighPrecision3_Multiply1;
const
fn_inp='hp5.inp';
fn_out='hp5.out';
maxlen=100; { max length of the number }
type
hp=record
len:integer; { length of the number }
s:array[1..maxlen] of integer
{ s[1] is the lowest position
s[len] is the highest position }
end;
var
x,y:hp;
z,w:integer;
procedure PrintHP(const p:hp);
var i:integer;
begin
for i:=p.len downto 1 do write(p.s[i]);
end;
procedure init;
var
st:string;
i:integer;
begin
assign(input,fn_inp);
reset(input);
readln(st);
x.len:=length(st);
for i:=1 to x.len do { change string to HP }
x.s[i]:=ord(st[x.len+1-i])-ord('0');
readln(z);
close(input);
end;
procedure Divide(a:hp;b:integer;var c:hp;var d:integer);
{ c:=a div b ; d:=a mod b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
len:=a.len;
d:=0;
for i:=len downto 1 do { from high to low }
begin
d:=d*10+a.s[i];
c.s[i]:=d div b;
d:=d mod b;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;
procedure main;
begin
Divide(x,z,y,w);
end;
procedure out;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
writeln(w);
close(output);
end;
begin
init;
main;
out;
end.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
富港检测东莞有限公司
2024-12-25 广告
2024-12-25 广告
ISTA3L是一个基于研究、数据驱动的测试协议,它模拟了由零售公司完成的产品订单被直接运送给消费者时所经历的危险,它允许用户评估包装产品的能力,以承受运输和处理包装产品时所经历的供应链危险,从接收到任何电子商务零售商履行操作,直到最终消费者...
点击进入详情页
本回答由富港检测东莞有限公司提供
展开全部
高精度运算不仅能够扩大整数的值域,而且能够通过扩大小数的位数减低除法的精度误差,甚至还可以计算出循环节。设
设小数部分的位数上限为limit;小数部分的指针为len;st为循环节的首指针;s为小数序列,其中s[i]为第i位小数;posi为余数的位序列,其中posi[x]表示余数为x的位序号。
记下第1位的余数和小数(posi[x mod y]←1,s[1]←(x mod y)*10 div y,x←x mod y);然后按照除法的运算规则计算第2位、第3位的余数和小数¨¨。若下一位余数先前出现过(posi[x]<>0),则先前出现的位置posi[x]为循环节的开始(st←posi[x]),退出计算过程;否则依次类推,直至小数位数达到上限limit为止。
主要过程如下(不是完整的,程序头和其他的自己加上去);
fillchar(s,sizeof(s),0);{小数部分初始化}
fillchar(posi,sizeof(posi),0); {小数值的位序列初始化}
len←0;st←0; {小数部分的指针和循环节的首指针初始化}
read(x,y);{读被除数和除数}
write(x div y);{输出整数部分}
x←x mod y;{计算x除以y的余数}
if x=0 then exit;{若x除尽y,则成功退出}
while len<limit do{若小数位未达到上限,则循环}
begin
inc(len);posi[x]←len;{记下当前位小数,计算下一位小数和余数}
x←x*10; s[len]←x div y;x←x mod y;
if posi[x]<>0 {若下一位余数先前出现过,则先前出现的位置为循环节的开始}
then begin st←posi[x]; break;end;{then}
if x=0 then break; {若除尽,则成功退出}
end;{while}
if len=0
then begin writeln;exit;end;{若小数部分的位数为0,则成功退出;否则输出小数点}
write('.');
if st=0 {若无循环节,则输出小数部分,否则输出循环节前的小数和循环节}
then for i←1 to len do write(s[i])
else begin
for i←1 to st-1 do write(s[i]);
write('(');
for i←st to len do write(s[i]);
write(')');
end;{else}
高精度处以高精度求商
var b,i,l1,l2,k1,k2,t,x:longint;
a1,a2,s:array[1..100] of longint;
function check:boolean;
var i:integer;
begin
for i:=100 downto 1 do if a1[i]<>0 then break;
if a1[i]<0 then begin exit(false);end;
if l1<l2 then begin inc(t);exit(false); end;
if l1=l2 then
for i:=l1 downto 1 do if a1[i]>a2[i] then exit(true) else if a1[i]<a2[i] then begin t:=t+1;exit(false);end;
exit(true);
end;
begin
readln(l1);k1:=l1+1;
for i:=1 to l1 do
begin
dec(k1);
read(x);
a1[k1]:=x;
end;
readln(l2);k2:=l2+1;
for i:=1 to l2 do
begin
dec(k2);
read(x);
a2[k2]:=x;
end;
t:=0;
while true do
begin
inc(t);
fillchar(s,sizeof(s),0);
for i:=1 to l1 do
begin
s[i]:=s[i]+a1[i]-a2[i];
if (s[i]<0) then begin s[i]:=s[i]+10;s[i+1]:=s[i+1]-1;end;
end;
a1:=s;
for i:=l1 downto 1 do if a1[i]<>0 then break;
if a1[l1]<0 then break else l1:=i;
if check then continue else begin dec(t);break;end;
end;
writeln(t);
end.
不断相减直到差为负数
设小数部分的位数上限为limit;小数部分的指针为len;st为循环节的首指针;s为小数序列,其中s[i]为第i位小数;posi为余数的位序列,其中posi[x]表示余数为x的位序号。
记下第1位的余数和小数(posi[x mod y]←1,s[1]←(x mod y)*10 div y,x←x mod y);然后按照除法的运算规则计算第2位、第3位的余数和小数¨¨。若下一位余数先前出现过(posi[x]<>0),则先前出现的位置posi[x]为循环节的开始(st←posi[x]),退出计算过程;否则依次类推,直至小数位数达到上限limit为止。
主要过程如下(不是完整的,程序头和其他的自己加上去);
fillchar(s,sizeof(s),0);{小数部分初始化}
fillchar(posi,sizeof(posi),0); {小数值的位序列初始化}
len←0;st←0; {小数部分的指针和循环节的首指针初始化}
read(x,y);{读被除数和除数}
write(x div y);{输出整数部分}
x←x mod y;{计算x除以y的余数}
if x=0 then exit;{若x除尽y,则成功退出}
while len<limit do{若小数位未达到上限,则循环}
begin
inc(len);posi[x]←len;{记下当前位小数,计算下一位小数和余数}
x←x*10; s[len]←x div y;x←x mod y;
if posi[x]<>0 {若下一位余数先前出现过,则先前出现的位置为循环节的开始}
then begin st←posi[x]; break;end;{then}
if x=0 then break; {若除尽,则成功退出}
end;{while}
if len=0
then begin writeln;exit;end;{若小数部分的位数为0,则成功退出;否则输出小数点}
write('.');
if st=0 {若无循环节,则输出小数部分,否则输出循环节前的小数和循环节}
then for i←1 to len do write(s[i])
else begin
for i←1 to st-1 do write(s[i]);
write('(');
for i←st to len do write(s[i]);
write(')');
end;{else}
高精度处以高精度求商
var b,i,l1,l2,k1,k2,t,x:longint;
a1,a2,s:array[1..100] of longint;
function check:boolean;
var i:integer;
begin
for i:=100 downto 1 do if a1[i]<>0 then break;
if a1[i]<0 then begin exit(false);end;
if l1<l2 then begin inc(t);exit(false); end;
if l1=l2 then
for i:=l1 downto 1 do if a1[i]>a2[i] then exit(true) else if a1[i]<a2[i] then begin t:=t+1;exit(false);end;
exit(true);
end;
begin
readln(l1);k1:=l1+1;
for i:=1 to l1 do
begin
dec(k1);
read(x);
a1[k1]:=x;
end;
readln(l2);k2:=l2+1;
for i:=1 to l2 do
begin
dec(k2);
read(x);
a2[k2]:=x;
end;
t:=0;
while true do
begin
inc(t);
fillchar(s,sizeof(s),0);
for i:=1 to l1 do
begin
s[i]:=s[i]+a1[i]-a2[i];
if (s[i]<0) then begin s[i]:=s[i]+10;s[i+1]:=s[i+1]-1;end;
end;
a1:=s;
for i:=l1 downto 1 do if a1[i]<>0 then break;
if a1[l1]<0 then break else l1:=i;
if check then continue else begin dec(t);break;end;
end;
writeln(t);
end.
不断相减直到差为负数
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询