大数A-B

还没写过大数减法,今天比赛还WA了两次。。。

 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 }
View Code

 

posted on 2013-11-23 17:34  straw_berry  阅读(238)  评论(0编辑  收藏  举报