HDU ACM 2100

今天写到了杭电的一道ACM题,困扰了我好久,不过终于AC了,写代码的时候还是感觉那么乱,可能这就是成长的阵痛吧。

话不多说,下面是题目的描述

HDU ACM 2100_第1张图片

HDU ACM 2100_第2张图片

这道题,就是经典的进制之间转化的题目,和同期的比赛很像。而字符型变量和整形变量可以相互转化,就带来了我们最后的解法。开始是我想完全将其转化为整数再将其转化回字符串。但后来发现这样难度太大,而且也不够简介。故想到利用整形数组储存每一个位置上的数,利用一个进位符进行进位(最多也就进1位啦)但是,我们在输入时,高位次的数先输入,也就摆在了数组的前面。所以在利用整形数组存储的时候应该倒置存储。而后由于字符串的长度不一样长,所以取较长的长度进行处理。但如图第一种输入时,可能会有很多A出现(类似于65用了00065输出)所以应该先搜索找到第一个不为A的位置再进行字符串的输出。

下面是AC的代码:

#include
#include
#include
#include
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;
}



你可能感兴趣的:(动态规划)