今天写到了杭电的一道ACM题,困扰了我好久,不过终于AC了,写代码的时候还是感觉那么乱,可能这就是成长的阵痛吧。
话不多说,下面是题目的描述
这道题,就是经典的进制之间转化的题目,和同期的比赛很像。而字符型变量和整形变量可以相互转化,就带来了我们最后的解法。开始是我想完全将其转化为整数再将其转化回字符串。但后来发现这样难度太大,而且也不够简介。故想到利用整形数组储存每一个位置上的数,利用一个进位符进行进位(最多也就进1位啦)但是,我们在输入时,高位次的数先输入,也就摆在了数组的前面。所以在利用整形数组存储的时候应该倒置存储。而后由于字符串的长度不一样长,所以取较长的长度进行处理。但如图第一种输入时,可能会有很多A出现(类似于65用了00065输出)所以应该先搜索找到第一个不为A的位置再进行字符串的输出。
下面是AC的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str1[205], str2[205];
int s1[205], s2[205], s[205];
int main()
{
int len1, len2, len, i, j, flag;
while (cin >> str1 >>str2)
{
flag = 0;
memset(s1, 0, sizeof(s1));
memset(s2, 0, sizeof(s2));
memset(s, 0, sizeof(s));
len1 = strlen(str1); len2 = strlen(str2);
for (i = 0; i < len1; i++)
s1[len1 - i - 1] = str1[i] - 65;
for (i = 0; i < len2; i++)
s2[len2 - i - 1] = str2[i] - 65;
len = max(len1, len2);
for (i = 0; i <= len; i++)
{
s[i] = flag + s1[i] + s2[i];
if (s[i]>25)
{
flag = 1;
s[i] -= 26;
}
else flag = 0;
}
flag = 0;
for (j = i; j >= 0; j--)
{
if(flag)
printf("%c", s[j] + 65);
if (flag == 0 && s[j] != 0)
{
flag = 1;
printf("%c", s[j] + 65);
}
}
printf("\n");
}
return 0;
}