题目描述
22世纪,科学家们发现火星上的居民智能很高。火星人热爱算术。每年他们都要举行火星算术比赛简称ACM。比赛的任务是计算两个100位数的和,用时最少者获胜。今年他们也邀请地球人参加此项赛事。
作为地球人的唯一代表,你被送到火星上向他们展示人类的智慧。幸运的是,你带上了笔记本电脑,这将帮助你快速完成这项任务。现在唯一的问题就是编程计算两个100位数的和。需要注意的是,火星人用的是20进制,因为他们有20个手指。输入
给定你多对火星数,每个数占一行。火星数包括0~9,以及小写字母a~j,小写字母分别代表十进制中的10~19。每个数位数不超过100位。
输出
输出每对数的和,每个和占一行。
样例输入 复制
1234567890 abcdefghij 99999jjjjj 9999900001
样例输出 复制
bdfi02467j iiiij00000
#include <stdio.h>
#include <string.h>
void reverse(char* str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char c = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = c;
}
}
int main() {
char sa[1005], sb[1005], t[1005];
int v[1005] = {0};
int i, a, b, sum;
int flag;
while (scanf("%s%s", sa, sb) != EOF) {
flag = 0;
memset(v, 0, sizeof(v));
sum = 0;
reverse(sa);
reverse(sb);
if (strlen(sa) < strlen(sb)) {
strcpy(t, sa);
strcpy(sa, sb);
strcpy(sb, t);
}
for (i = 0; i < strlen(sa); i++) {
if (sa[i] >= '0' && sa[i] <= '9') {
a = sa[i] - '0';
} else if (sa[i] >= 'a' && sa[i] <= 'j') {
a = sa[i] - 'a' + 10;
}
if (i >= strlen(sb)) {
b = 0;
} else {
if (sb[i] >= '0' && sb[i] <= '9') {
b = sb[i] - '0';
} else if (sb[i] >= 'a' && sb[i] <= 'j') {
b = sb[i] - 'a' + 10;
}
}
sum = a + b + flag;
if (sum > 19) {
flag = 1;
sum -= 20;
} else {
flag = 0;
}
v[i] = sum;
}
if (flag == 1) {
v[strlen(sa)] = 1;
}
for (i = strlen(sa) - 1; i >= 0; i--) {
if (v[i] < 10) {
printf("%d", v[i]);
} else {
printf("%c", 'a' + v[i] - 10);
}
}
printf("\n");
}
return 0;
}
以下是每部分用到的代码介绍
void reverse(char* str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char c = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = c;
}
}
翻转字符串
这段代码定义了一个名为
reverse()
的函数,它接收一个指向字符型数组的指针作为参数,然后将该数组中的字符内容进行反转。具体实现方法是通过交换开头和结尾的字符,并依次向中间靠拢,直到达到中点位置。
for (i = 0; i < strlen(sa); i++) {
if (sa[i] >= '0' && sa[i] <= '9') {
a = sa[i] - '0';
} else if (sa[i] >= 'a' && sa[i] <= 'j') {
a = sa[i] - 'a' + 10;
}
if (i >= strlen(sb)) {
b = 0;
} else {
if (sb[i] >= '0' && sb[i] <= '9') {
b = sb[i] - '0';
} else if (sb[i] >= 'a' && sb[i] <= 'j') {
b = sb[i] - 'a' + 10;
}
}
//以上是对数组数字的转换或置零
sum = a + b + flag;
if (sum > 19) {
flag = 1;
sum -= 20;//和sum%20一样的效果
} else {
flag = 0;
}
v[i] = sum;
}
if (flag == 1) {
v[strlen(sa)] = 1;
}
//倒序转换输出
for (i = strlen(sa) - 1; i >= 0; i--) {
if (v[i] < 10) {
printf("%d", v[i]);
} else {
printf("%c", 'a' +v[i] - 10);
}
}