1074. 宇宙无敌加法器(20)
原题: 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] = '\0'; // 这个不能少
i = len - 1;
for (j = strlen(tmp2) - 1; j >= 0; j--) num2[i--] = tmp2[j];
num2[len] = '\0';
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] = '\0'; // 这行也可以不需要
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;
}