1074 宇宙无敌加法器
思路:
用string分别接收进制表和两个加数,然后存到三个列表里去。注意,进制表那个列表,假如string里的数字是0,则存进去的数字应该是10
当加数的位数不到N位时,前面补0至N位。
然后就是从最小位开始加和,和=加数+加数+flag进位标志:
- 假如和小于进制,则该位就是和,flag=0
- 假如和大于等于进制,则该位就是和减去进制,flag=1
输出的时候,注意:
- 假如flag是1,那么正常输出整个数字即可,因为不会出现数字前面有0的情况
- 假如flag是0,那么要先把前面的0都给去掉,再输出数字。
- 假如把0去完之后发现数字没了(两数之和就是0),那么就输出0
PS:
- 最后答案前面的0注意要去掉
- 要考虑两数之和是0的情况(测试点5)
- 把char转换为int的方法:c-‘0’
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int vel[25], vea[25], veb[25];
int main(void) {
string s; cin >> s;
string a, b; cin >> a >> b;
while (a.size() < s.size()) { a = '0' + a; }
while (b.size() < s.size()) { b = '0' + b; }
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0') { vel[i] = 10; }
else { vel[i] = s[i] - '0'; }
vea[i] = a[i] - '0';
veb[i] = b[i] - '0';
}
reverse(vel, vel + s.size());
reverse(vea, vea + s.size());
reverse(veb, veb + s.size());
int ans[25];
int flag = 0; // 进位标志
for (int i = 0; i < s.size(); i++) {
int he = vea[i] + veb[i] + flag;
if (he < vel[i]) { ans[i] = he; flag = 0; }
if (he >= vel[i]) { ans[i] = he - vel[i]; flag = 1; }
}
if (flag == 1) {
ans[s.size()] = 1;
for (int i = s.size(); i >= 0; i--) { cout << ans[i]; }
}
else {
int n = s.size() - 1;
while (ans[n] == 0 && n >= 0) { n--; }
if (n < 0) { cout << 0; }
else {
for (int i = n; i >= 0; i--) { cout << ans[i]; }
}
}
return 0;
}