原题: https://www.patest.cn/contests/pat-b-practise/1074
思路: 就是人工模拟加法的问题, 正常进制都是10, 现在就是进制从字符串中
读取. 但有些情况要坐下特殊处理, 比如输入的两个数可能位数不一样, 这对
我们后续计算造成不小的麻烦, 我的做法是强制补前导0, 使输入完全一致.
另外需要注意两个3位数相加可能得到4位数, 所以结果字符串要开大一些. 题目
中给的数字范围都没什么暖用, 比如题目中说了输入的两个数是正的, 但结果测试
仍然会检查输出为0的情况, 试问两个正数相加怎么能得0呢, 但是我们实现的算法
不管有没有0, 都能正常工作.
题目中有个数字是有用的, 那就是数字的位数为20位, 这就要求在后续打印数字的
时候不能采用sscanf进行字符串转数字. 只能采用传统的方法使用getchar一步
打印
测试点3和测试点4测试的是数非常大的情况, 比如20位
测试点5测试的是输出0的情况
实现:
#include <stdio.h>
#include <string.h>
#define LEN 30
int main (void) {
char table[LEN];
int len;
char num1[LEN];
char num2[LEN];
char res[LEN];
char tmp1[LEN];
char tmp2[LEN];
int i;
int j;
table[0] = '0';
scanf("%s", table + 1);
scanf("%s", tmp1);
scanf("%s", tmp2);
len = strlen(table);
for (i = 0; i < len; i++) {
num1[i] = '0';
num2[i] = '0';
res[i] = '0';
}
i = len - 1;
for (j = strlen(tmp1) - 1; j >= 0; j--) num1[i--] = tmp1[j];
num1[len] = ' '; // 这个不能少
i = len - 1;
for (j = strlen(tmp2) - 1; j >= 0; j--) num2[i--] = tmp2[j];
num2[len] = ' ';
int now;
int carry = 0; // 进位
int sys; // 进制
for (i = len - 1; i >= 0; i--) {
if (table[i] == '0') {
sys = 10;
} else {
sys = table[i] - '0';
}
now = (num1[i] - '0') + (num2[i] - '0') + carry;
if (now < sys) {
res[i] = now + '0';
carry = 0;
} else {
carry = 1;
res[i] = now - sys + '0';
}
}
res[len] = ' '; // 这行也可以不需要
for (i = 0; i < len; i++) {
if (res[i] != '0') break;
}
if (i == len) {
printf("0");
} else {
for (; i < len; i++) {
printf("%c", res[i]);
}
}
return 0;
}