高精度減法(詳細(xì)解答)
/*
目前信息技術(shù)鄰域啊高進(jìn)度運(yùn)算越來越普遍,但是又非常難啊。
現(xiàn)在up來溫習(xí)一下高進(jìn)度運(yùn)算,試一試蛤,順便來幫助大家理解一下
up打字辛苦給給一個(gè)免費(fèi)的贊吧,求你們了,謝謝!
話不多說,直接開始?
*/?

#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個(gè)先要做減法的數(shù)?
//如果以下兩種情況出現(xiàn)(符合),那么a<b,所以2個(gè)數(shù)調(diào)換并輸出“-”
//因?yàn)樾?shù)-大數(shù)=負(fù)數(shù),而負(fù)數(shù)又是大數(shù)-小數(shù)的相反數(shù)。?
/*
第一種:當(dāng)a1的位數(shù)小于b1的位數(shù),那么調(diào)換并加“-”;
第二種(同時(shí)滿足一下兩種情況)
1.位數(shù)相同
2.a1與b1中只要同位里a1的位數(shù)小于b1的位數(shù)(從高位到低位)
? ?比如:4328與4331,4相同,3相同,2比3小,所以4328小于4331.
如果以上2種都符合,那么調(diào)換并加“-”?
*/?
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);
//這個(gè)la-i的意思是倒敘記錄a1,b1數(shù)組,把它記錄到a,b數(shù)組里 。?
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是答案的位數(shù)長度,i是下標(biāo),x是借位?
while(i<=la||i<=lb)
{
? ? if(a[i]<b[i])//如果當(dāng)前位數(shù)較小,那么就需要借位了。?
? ? {
? ? a[i]+=10;//當(dāng)前為數(shù)+10,(借位了)?
? ? a[i+1]--;//前面那個(gè)位數(shù)-1
//比如:514-331我們發(fā)現(xiàn)1不夠減了(即十位),所以我們在5那里借位并在5那個(gè)位數(shù)(即3)-1?
? ? }
? ? c[i]=a[i]-b[i];//把當(dāng)前位數(shù)運(yùn)算結(jié)果保存到c[i]里?
? ? i++;//每循環(huán)一次i自增1;?
}
? ? lc=i;//最后lc即答案長度位i最后的值
//輸出結(jié)果?
? ? while((c[lc]==0)&&(lc>1)) lc--;
? ? for(i=lc;i>=1;i--) cout<<c[i];
? ? cout<<endl;
return 0;
}