高精度减法(详细解答)
/*
目前信息技术邻域啊高进度运算越来越普遍,但是又非常难啊。
现在up来温习一下高进度运算,试一试蛤,顺便来帮助大家理解一下
up打字辛苦给给一个免费的赞吧,求你们了,谢谢!
话不多说,直接开始
*/

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char a1[1000],b1[1000],n[1000];
int a[1000],b[1000],c[1000],la,lb,lc,i,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>a1>>b1;//输入2个先要做减法的数
//如果以下两种情况出现(符合),那么a<b,所以2个数调换并输出“-”
//因为小数-大数=负数,而负数又是大数-小数的相反数。
/*
第一种:当a1的位数小于b1的位数,那么调换并加“-”;
第二种(同时满足一下两种情况)
1.位数相同
2.a1与b1中只要同位里a1的位数小于b1的位数(从高位到低位)
比如:4328与4331,4相同,3相同,2比3小,所以4328小于4331.
如果以上2种都符合,那么调换并加“-”
*/
if(/*第一种*/strlen(a1)<strlen(b1)||/*第二种*/(strlen(a1)==strlen(b1)&&strcmp(a1,b1)<0))
{
strcpy(n,a1);
strcpy(a1,b1);
strcpy(b1,n);
cout<<"-";
}
//a1与b1的长度分别记录到la与lb中
la=strlen(a1);
lb=strlen(b1);
//这个la-i的意思是倒叙记录a1,b1数组,把它记录到a,b数组里 。
for(i=0;i<=la-1;i++) a[la-i]=a1[i]-48;
for(i=0;i<=lb-1;i++) b[lb-i]=b1[i]-48;
lc=1;i=1;x=0;//lc是答案的位数长度,i是下标,x是借位
while(i<=la||i<=lb)
{
if(a[i]<b[i])//如果当前位数较小,那么就需要借位了。
{
a[i]+=10;//当前为数+10,(借位了)
a[i+1]--;//前面那个位数-1
//比如:514-331我们发现1不够减了(即十位),所以我们在5那里借位并在5那个位数(即3)-1
}
c[i]=a[i]-b[i];//把当前位数运算结果保存到c[i]里
i++;//每循环一次i自增1;
}
lc=i;//最后lc即答案长度位i最后的值
//输出结果
while((c[lc]==0)&&(lc>1)) lc--;
for(i=lc;i>=1;i--) cout<<c[i];
cout<<endl;
return 0;
}