两个数减法运算,会出现负数的情况,两个数的位数是10万级。
输出:
一行,减法运算结果。
该题由于数据的位数较大,所以将数据以字符形式读入,然后经过运算之后,再通过数值形式输出。
- 首先将两个数读入,读入两个字符串
- 将字符串转换成数值类型,放在容器里面,A.push_back(data);放数据的时候是从A[0]开始放
- 调用构造的减法函数
- 先判断两个数谁大,谁小,我们用大的数值减去小的数值,最后输出的时候,判断是否输出负号。
- 减法从最低为开始运算,如果该为减法之后出来的结果是负值,则需要借位
- 如果被减数没有了,则直接用减数位减去借位。
- 每一位通过C.push_back();放在C里,从0(地位)——到高位存,低位数存低位地址里。
- 输出的时候先判断正负,再输出C里面的值,从高位倒着输出。
#include巧妙的程序:#include using namespace std; bool cmp(vector A, vector B) { if(A.size() != B.size()) return A.size() > B.size(); for(int i = A.size() - 1; i >= 0; i--) { if(A[i] != B[i]) return A[i] > B[i];//不相等的时候返回 } return true; } vector sub(vector A, vector B) { if(!cmp(A, B)) { return sub(B, A); } vector C; int b = 0;//借位 int t = 0;//当前位结果 for(int i = 0; i < A.size(); i++) { if(i < B.size()) t = A[i] - B[i] - b; else t = A[i] - b; if(t < 0) { b = 1; C.push_back(t + 10); } else { b = 0; C.push_back(t); } } while(C.size() > 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a, b; vector A, B; cin >> a >> b; for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); for(int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0'); auto C = sub(A, B); if(!cmp(A, B)) { printf("-"); } for(int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); return 0; }
其中,两个数比较大小的程序比较巧妙,通过一个bool类型的返回值,判断是否是A>=B。
- A >= B 返回:true
- A < B 返回:false
当 return A[i] > B[i] 时,如果满足条件,则返回true, 如果条件不满足,则返回false。
比较两个数的大小,先通过两个数的位数比较,如果位数相同,再从高位向低位逐位比较,当出现不相等的位时就可以判断,哪个大了。
活动地址:毕业季·进击的技术er



