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时,加法和减法都不会减数。所以在循环内部需要区分,到底哪个数已经提前到头了(到最高位了?)。
这样,就可以用一个循环写出加法和减法。