高精度减法
高精度减法
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<s2 then begin fh:='-';s:=s1; s1:=s2; s2:=s; end;
{————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]<b[i] then p:=true;{最终判断数值AB的大小}
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]<b[i] then p:=true;
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.
{水平不足之处请见谅}
#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;
char a[1000]={0},b[1000]={0},d[1000],c[1000]={0};int l1,l2,k,i;
int main()
{
ifstream cin("1.txt",ios::in);
cin.getline(c,1000);
cin.getline(d,1000);
l1=strlen(c);l2=strlen(d);
for(i=0;i<l1;i++)
a[i]=c[l1-i-1]-'0';
for(i=0;i<l2;i++)
b[i]=d[l2-i-1]-'0';
if(l1>l2){k=l1;}else{k=l2;}
for(i=0;i<k;i++)
{
a[i]+=b[i];a[i+1]+=a[i]/10;a[i]%=10;
}
if(a[k]!=0) k++;
for(i=k-1;i>=0;i--)
{
a[i]+='0';
cout<<a[i];
}
cout<<endl;
system("pause");
}