大数减法
思路:
同大数加法,采用模拟笔算减法的策略,注意细节处理的问题。同样返回的为string类。
代码如下:
1 /* 2 1.比较减数与被减数的长度,确定正负号 3 2.模拟笔算 4 (1)a[i]==b[j] 5 (2)a[i]<b[j] //退位 6 (3)a[i]>b[j] 7 */ 8 #include<iostream> 9 #include<string> 10 using namespace std; 11 string jianfa(string a,string b) 12 { 13 string c="",ans="",t; 14 int flag=0,k=0;//flag退位的标志 15 bool flag2=false;//结果正负的标志 16 if(a.length()<b.length()||(a.length()==b.length()&& a.compare(b)<0)) 17 { t=a;a=b;b=t;flag2=true;} 18 int i=a.length()-1,j=b.length()-1; 19 while(i>=0&&j>=0) 20 { 21 if(a[i]+flag>b[j]) 22 { 23 c+=a[i]+flag-b[j]+'0'; 24 flag=0; 25 } 26 else if (a[i]+flag==b[j]) 27 { 28 c+='0'; 29 flag=0; 30 } 31 else 32 { 33 c+=(a[i]-'0')+flag+10-(b[j]-'0')+'0'; 34 flag=-1; 35 } 36 i--;j--;k++; 37 } 38 while(i>=0) 39 { 40 if(a[i]+flag<'0') 41 { 42 c+=a[i]+flag+10+'0'; 43 flag=-1; 44 } 45 else 46 { 47 c+=a[i]+flag; 48 flag=0; 49 } 50 i--,k++; 51 } 52 int len=k-1; 53 while(c[len]=='0'&&len>0)len--;//检索高位 54 for(j=0;j<=len;j++) 55 ans+=c[j]; 56 if(flag2) 57 { ans+='-';}//结果正负判断 58 char tt; 59 for(i=0,j=ans.length()-1;i<j;i++,j--)//倒置 60 { tt=ans[i];ans[i]=ans[j];ans[j]=tt;} 61 return ans; 62 } 63 int main() 64 { 65 string a,b; 66 while(cin>>a>>b) 67 { 68 cout<<jianfa(a,b)<<endl; 69 } 70 return 0; 71 }