永发信息网

pascal高精度减法

答案:3  悬赏:0  手机版
解决时间 2021-03-07 15:10
  • 提问者网友:謫仙
  • 2021-03-07 03:04
pascal高精度减法
最佳答案
  • 五星知识达人网友:行路难
  • 2021-03-07 04:15
1、和高精度加法相比,减法在差为负数时处理的细节更多一点:当被减数小于减数时,差为负数,差的绝对值是减数减去被减数;在程序实现上用一个变量来存储符号位,用另一个数组存差的绝对值。

  2、算法流程:

  (1)读入被减数S1,S2(字符串);

  (2)置符号位:判断被减数是否大于减数:大则将符号位置为空;小则将符号位置为“-”,交换减数与被减数;

  (3)被减数与减数处理成数值,放在数组中;

  (4)运算:

  A、取数;

  B、判断是否需要借位;

  C、减,将运算结果放到差数组相应位中;

  D、判断是否运算完成:是,转5;不是,转A;

  (5)打印结果:符号位,第1位,循环处理第2到最后一位;

  3、细节:

  ▲如何判断被减数与减数的大小:字符串知识

  ①(1)首先将两个字符串的位数补成一样(因为字符串的比较是从左边对齐的;两个字符串一样长才能真正地比较出大小):短的在左边补0

  k1:=length(s1);

  k2:=length(s2);

  if k1>k2 then for i:=1 to k1-k2 do s2:='0'+s2

  else for i:=1 to k2-k1 do s1:='0'+s1;

  (2)接着比较大小:直接比较字符串大小

  fh:='';

  if s1
  {————s1存被减数,符号存符号}

  ②通过数组分析完成大小比较(当数值长度超过256位时发挥重要作用)

  readln(s);{输入整个算式,即'a+b='}

  l1:=pos('-',s);(搜索'-'的位置)

  for i:=1 to l1-1 do {从字符串中分离出数值A}

  a[l1-i]:=ord(s[i])-48;

  dec(l1);{将'-'号位置转换为数值A的长度}

  x2:=length(s);{获取算式长度}

  l2:=x2-l1-2;{得到数值B长度}

  for i:=l1+2 to x2 do{将数值B分离出}

  b[x2-i]:=ord(s[i])-48;

  if l2>l1 then p:=true{开始分析数值AB的大小,如果B位数高则B更大}

  else if l2=l1 then{如果相等则进入详细分析}

  begin

  i:=l1;

  while (i>0)and(a[i]=b[i]) do dec(i);{从高到低依次检索AB每位的大小,如果有非等于则退出}

  if a[i]
  end;

  ▲将字符串处理成数值:

  l:=length(s1);{求出s1的长度,也即s1的位数;有关字符串的知识。}

  k1:=260;

  for i:=l downto 1 do

  begin

  a[k1]:=ord(s1)-48;{将字符转成数值}

  k1:=k1-1;

  end;

  k1:=k1+1;

  ▲打印结果:

  例:差:第一位是12,第二位是234,第三位是1234,最后一位:3。它的实际数值是12023412340003。

  从上例可以看出:打印时,从第二位开始,因为每一段都代表4位,不足4位的要补足0。

  write(fh,c[k]);{k是差的第1位;}

  for i:=k+1 to 260 do

  begin

  if c<1000 then write('0');

  if c<100 then write('0');

  if c<10 then write('0');

  write(c);

  end;

  程序源代码:

  {PASCAL}

  Program a1;

  var a,b,c:array [1..100] of integer;

  x2,l1,l2,i:integer;

  p:boolean;

  s:string;

  begin

  readln(s);

  l1:=pos('-',s);

  for i:=1 to l1-1 do

  a[l1-i]:=ord(s[i])-48;

  dec(l1);

  x2:=length(s);

  l2:=x2-l1-2;

  for i:=l1+2 to x2 do

  b[x2-i]:=ord(s[i])-48;

  if l2>l1 then p:=true

  else if l2=l1 then

  begin

  i:=l1;

  while (i>0)and(a[i]=b[i]) do dec(i);

  if a[i]
  end;

  if p then

  begin

  for i:=1 to l2 do c[i]:=b[i]-a[i];

  for i:=1 to l2 do

  if c[i]<0 then

  begin

  c[i]:=c[i]+10;

  dec(c[i+1]);

  end;

  i:=l2;

  while c[i]=0 do dec(i);

  write('-');

  for l2:=i downto 1 do write(c[i]);

  writeln;

  end

  else

  begin

  for i:=1 to l1 do c[i]:=a[i]-b[i];

  for i:=1 to l1 do

  if c[i]<0 then

  begin

  c[i]:=c[i]+10;

  dec(c[i+1]);

  end;

  i:=l1;

  while c[i]=0 do dec(i);

  for l1:=i downto 1 do write(c[i]);

  writeln;

  end;

  end.
全部回答
  • 1楼网友:酒者煙囻
  • 2021-03-07 06:06
高精度减法程序如下:
program HighPrecision2_Subtract;
const
fn_inp='hp2.inp';
fn_out='hp2.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:array[1..2] of hp;
y:hp; { x:input ; y:output }
positive:boolean;
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;
j,i:integer;
begin
assign(input,fn_inp);
reset(input);
for j:=1 to 2 do
begin
readln(st);
x[j].len:=length(st);
for i:=1 to x[j].len do { change string to HP }
x[j].s[i]:=ord(st[x[j].len+1-i])-ord('0');
end;
close(input);
end;
procedure Subtract(a,b:hp;var c:hp); { c:=a-b, suppose a>=b }
var i,len:integer;
begin
fillchar(c,sizeof(c),0);
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
for i:=1 to len do { subtract from low to high }
begin
inc(c.s[i],a.s[i]-b.s[i]);
if c.s[i]<0 then
begin
inc(c.s[i],10);
dec(c.s[i+1]); { add 1 to a higher position }
end;
end;
while(len>1) and (c.s[len]=0) do dec(len);
c.len:=len;
end;
function Compare(const a,b:hp):integer;
{
1 if a>b
0 if a=b
-1 if a}
var len:integer;
begin
if a.len>b.len then len:=a.len { get the bigger length of a,b }
else len:=b.len;
while(len>0) and (a.s[len]=b.s[len]) do dec(len);
{ find a position which have a different digit }
if len=0 then compare:=0 { no difference }
else compare:=a.s[len]-b.s[len];
end;
procedure main;
begin
if Compare(x[1],x[2])<0 then positive:=false
else positive:=true;
if positive then Subtract(x[1],x[2],y)
else Subtract(x[2],x[1],y);
end;
procedure out;
begin
assign(output,fn_out);
rewrite(output);
if not positive then write('-');
PrintHP(y);
writeln;
close(output);
end;
begin
init;
main;
out;
end.
  • 2楼网友:迷人又混蛋
  • 2021-03-07 04:30
uses math;
var
a,b:array[1..10000000] of integer;
s1,s2:string;
i,j,n:integer;
boo:boolean;
procedure change(sa,sb:string);
var sc:string;
begin
sc:=sa;
sa:=sb;
sb:=sc;
end;
procedure print;
begin
for i:=j downto 1 do write(a[i]);
end;
begin
{ assign(input,'gjd.in');
assign(output,'gjd.out');
reset(input);
rewrite(output); }
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
boo:=false;
readln(s1);
readln(s2);
if (length(s2)>length(s1)) then begin
boo:=true;
change(s1,s2);
end;
if (length(s1)=length(s2)) and (ord(s2[1])>ord(s1[1])) then begin
boo:=true;
change(s1,s2);
end;
j:=1;
for i:=length(s1) downto 1 do begin
a[j]:=ord(s1[i])-48;
inc(j);
end;
j:=1;
for i:=length(s2) downto 1 do begin
b[j]:=ord(s2[i])-48;
inc(j);
end;
j:=max(length(s1),length(s2));
for i:=1 to j do
begin
if a[i]>=b[i] then
a[i]:=a[i]-b[i] else
begin
a[i]:=b[i]-a[i];
dec(a[i+1]); end;
end;
n:=j;
for i:=1 to n do
if a[i]=0 then dec(j);
if boo then write('-');
print;
{ close(input);
close(output); }
end.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯