EazyChange

导航

 
  1 #include<iostream>
  2 #include<cstring>
  3 #include<string>
  4 #include <vector>
  5 #include <algorithm>
  6 
  7 using namespace std;
  8 
  9 int compare(string a, string b)
 10 {
 11     if (a.size() > b.size())
 12     {
 13         return 1;
 14     }
 15     if (a.size() < b.size())
 16     {
 17         return -1;
 18     }
 19     for (int i = 0; i < a.size(); i++)
 20     {
 21         if (a[i]>b[i])
 22         {
 23             return 1;
 24         }
 25         if (a[i]<b[i])
 26         {
 27             return -1;
 28         }
 29     }
 30     return 0;
 31 }
 32 
 33 string add(string a, string b)
 34 {
 35     string res = "";
 36     int flag = 0;
 37     int i, j;
 38     for (i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--)
 39     {
 40         int tmp = a[i] + b[j] - 2 * '0' + flag;
 41         if (tmp >= 10)
 42         {
 43             tmp -= 10;
 44             flag = 1;
 45         }
 46         else
 47         {
 48             flag = 0;
 49         }
 50         res.insert(res.begin(), tmp + '0');
 51     }
 52     i++; j++;
 53     
 54     if (i == 0 && j == 0)
 55     {
 56         if (flag == 1)
 57         {
 58             res.insert(0, "1");
 59         }
 60     }
 61     else
 62     {
 63         string lastStr;
 64         if (i != 0)
 65         {
 66             lastStr = a.substr(0, i);
 67         }
 68         if (j != 0)
 69         {
 70             lastStr = b.substr(0, j);
 71         }
 72         if (flag == 0)
 73         {
 74             res.insert(0, lastStr);
 75         }
 76         else
 77         {
 78             for (int k = lastStr.size() - 1; k >= 0; k--)
 79             {
 80                 int tmp = lastStr[k] - '0' + flag;
 81                 if (tmp >= 10)
 82                 {
 83                     tmp -= 10;
 84                     flag = 1;
 85                 }
 86                 else
 87                 {
 88                     flag = 0;
 89                 }
 90                 res.insert(res.begin(), tmp + '0');
 91             }
 92             if (flag == 1)
 93             {
 94                 res.insert(0, "1");
 95             }
 96         }
 97     }
 98     return res;
 99 }
100 //保证大-小
101 string minus1(string a, string b)
102 {
103     string res;
104     int flag = 0;
105 
106     int i, j;
107     for (i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--)
108     {
109         int tmp = a[i] - b[j] - flag;
110         if (tmp < 0)
111         {
112             tmp += 10;
113             flag = 1;
114         }
115         else
116         {
117             flag = 0;
118         }
119         res.insert(res.begin(), tmp + '0');
120     }
121 
122 
123     for (int k = i; k >= 0; k--)
124     {
125         int tmp = a[k] - flag - '0';
126         if (tmp < 0)
127         {
128             tmp += 10;
129             flag = 1;
130         }
131         else
132         {
133             flag = 0;
134         }
135         if (k == 0)
136         {
137             if (tmp != 0)
138             {
139                 res.insert(res.begin(), tmp + '0');
140             }
141         }
142         else
143         {
144             res.insert(res.begin(), tmp + '0');
145         }
146     }
147     return res;
148 }
149 
150 string fun(string a)
151 {
152     int n = 0;
153     for (int i = 0; i < a.size(); i++)
154     {
155         if (a[i] != '0')
156         {
157             break;
158         }
159         else
160         {
161             n++;
162         }
163     }
164     if (n == a.size())
165     {
166         return "0";
167     }
168     a = a.substr(n, a.size() - n);
169     return a;
170 }
171 
172 int main()
173 {
174     string str1, str2;
175     while (cin >> str1>>str2)
176     {
177         bool sy1 = true, sy2 = true;
178         if (str1[0] == '-')
179         {
180             sy1 = false;
181             str1 = str1.substr(1, str1.size() - 1);
182         }
183         if (str2[0] == '-')
184         {
185             sy2 = false;
186             str2 = str2.substr(1, str2.size() - 1);
187         }
188         
189         if ((sy1 == true && sy2 == true) || (sy1 == false && sy2 == false))
190         {
191             string tmp = fun(add(str1, str2));
192             if (sy1)
193             {
194                 cout << tmp << endl;
195             }
196             else
197             {
198                 if (tmp == "0")
199                 {
200                     cout << tmp << endl;
201                 }
202                 else
203                 {
204                     cout << "-" << tmp << endl;
205                 }
206             }
207         }
208         else
209         {
210             string tmp;
211             if (compare(str1, str2) == 1)
212             {
213                 tmp = fun(minus1(str1, str2));
214                 if (sy1)
215                 {
216                     cout << tmp << endl;
217                 }
218                 else
219                 {
220                     if (tmp == "0")
221                     {
222                         cout << tmp << endl;
223                     }
224                     else
225                     {
226                         cout << "-" << tmp << endl;
227                     }
228                 }
229             }
230             else
231             {
232                 tmp = fun(minus1(str2, str1));
233                 if (sy1)
234                 {
235                     if (tmp == "0")
236                     {
237                         cout << tmp << endl;
238                     }
239                     else
240                     {
241                         cout << "-" << tmp << endl;
242                     }
243                 }
244                 else
245                 {
246                     cout << tmp << endl;
247                 }
248             }
249         }
250 
251         
252     }
253     
254 
255     return 0;
256 }
自己写的代码,很乱

 

/**************************************************************************************************************************************************************************************/

2017年2月14日修改。

发这个帖子时只是想记录下自己写的代码,一定会去修改的。正好昨天在网上看到一个别人写的例子。我看了下,代码简洁,于是自己也仿写了下。

 

 1 string Add(string a, string b)
 2 {
 3     string res;
 4 
 5     int g = 0;
 6     for (int i = a.size() - 1, j = b.size() - 1; (g == 1) || (i >= 0 || j >= 0); i--, j--)
 7     {
 8         int x = g;
 9         if (i >= 0)
10         {
11             x += (a[i] - '0');
12         }
13         if (j >= 0)
14         {
15             x += (b[j] - '0');
16         }
17         res.insert(res.begin(), x % 10 + '0');
18 
19         //判断进位与否
20         g = x / 10;
21     }
22 
23     cout << res << endl;
24     return res;
25 }
26 
27 /*
28 减法函数
29 在函数外部保证参数a默认大于b
30 返回结果为正数字符串
31 */
32 string Minus(string a, string b)
33 {
34     string res;
35 
36     for (int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; i--, j--)
37     {
38         int x = 0;
39         if (i >=0)
40         {
41             x += (a[i] - '0');
42         }
43         if (j >=0)
44         {
45             x -= (b[j] - '0');
46         }
47 
48         //两种情况:1正常借位。2最高位借位
49         if (x < 0)
50         {
51             //最高位借位
52             if (i - 1 <= -1)
53             {
54                 res.insert(res.begin(), 0 - x + '0');
55             }
56             else//普通借位
57             {
58                 res.insert(res.begin(), x + 10 + '0');
59                 a[i - 1]--;
60             }
61         }
62         else
63         {
64             res.insert(res.begin(), x + '0');
65         }
66     }
67 
68     //弹出头部的0
69     while (res[0] == '0'&&res.size() > 1)
70     {
71         res.erase(res.begin(), res.begin() + 1);
72     }
73 
74     cout << res << endl;
75     return res;
76 }
简洁一些

 

之前自己写的时候,对于进位标志和最高位进位的处理,我写的很麻烦。现在的加法函数就很明了了。

用g表示进位,并且把g==1放进循环的判断。意思是:如果i和j判断都为假时,理论上到最高位了。不过进位不为0,还要计算啊。所以再把进位g算上。

这比我以前,在循环外再加上判断的写法好多了。

 

对于减法也是同样的道理。

不过减法肯定不会出现进位,只有借位。

其实现方式为:一个x变量=0,每次都加上被减数,然后减去减数。

判断x的大小,如果不是最高位,则把被减数的前一位减去1.如果是最高位就取相反数。

 

两者最妙之处在于。有一个if(i>0)和if(j>0)。这样就可以完美的兼容循环中的条件判断(i>=0)和(j>=0)

因为i和j任何一个等于0时,加法和减法都不会减数。所以在循环内部需要区分,到底哪个数已经提前到头了(到最高位了?)。

这样,就可以用一个循环写出加法和减法。

 

posted on 2017-02-08 21:16  EazyChange  阅读(773)  评论(0编辑  收藏  举报