还没写过大数减法,今天比赛还WA了两次。。。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 void sub(string a, string b) 6 { 7 string tmp,ans = "",c = ""; 8 int flag = 0;//借位 9 int k = 0; 10 bool flag1 = false;//判断是否加负号 11 12 if(a.length() < b.length() || (a.length() == b.length() && a.compare(b) < 0)) 13 { 14 flag1 = true; 15 tmp = a; 16 a = b; 17 b = tmp; 18 }//a < b时,交换a,b,并标记。 19 int i = a.length()-1; 20 int j = b.length()-1; 21 while(i >= 0 && j >= 0) 22 { 23 if(a[i] + flag > b[j]) 24 { 25 c += a[i]+flag-b[j]+'0'; 26 flag = 0; 27 } 28 else if(a[i]+flag == b[j]) 29 { 30 c += '0'; 31 flag = 0; 32 } 33 else 34 { 35 c += (a[i]-'0')+flag+10-(b[j]-'0')+'0'; 36 flag = -1; 37 } 38 i--; 39 j--; 40 k++; 41 } 42 while(i >= 0) 43 { 44 if(a[i] + flag < '0') 45 { 46 c += a[i]+flag+10+'0'; 47 flag = -1; 48 } 49 else 50 { 51 c += a[i]+flag; 52 flag = 0; 53 } 54 i--,k++; 55 } 56 int len = k-1; 57 while(c[len] == '0' && len >= 1) len--;//去前导0. 58 for(i = 0; i <= len; i++) 59 ans += c[i]; 60 if(flag1) 61 ans += '-'; 62 char t; 63 for(i = 0, j = ans.length()-1; i < j; i++,j--)//逆置输出。 64 { 65 t = ans[i]; 66 ans[i] = ans[j]; 67 ans[j] = t; 68 } 69 cout<<ans<<endl; 70 } 71 int main() 72 { 73 string a,b; 74 while(cin>>a>>b) 75 { 76 sub(a,b); 77 } 78 return 0; 79 }