HDU 2100Lovekey

4880 ワード

HDU 2100Lovekey
Problem Description XYZ-26進数は、それぞれ大文字の数字です.A、B、C、…、X、Y、Zはそれぞれ0~25の数字を順番に表し、1つのnビットの26進数を10進数に変換するルールA 0 A 1 A 2 A 3…An-1の各ビットが表す数字がa 0 a 1 a 2 a 2 a 3…an-1であれば、このXYZ-26進数の10進数は
m = a0 * 26^(n-1) + a1 * 26^(n-2) + … + an-3* 26^2 + an-2*26 + an-1
ある日viviは突然ロマンチックに游び始めて、学校の1つの教室に隠れて、枫氷の叶を探しに行かせて、もちろん、彼女も枫氷の叶が方向音痴ではないことを知っていて、そこでXYZのエビと水域の浪子を见つけて手伝って、彼らはvivi蔵の教室の入り口で、それぞれ1つのXYZ-26進数を书いて、それぞれaとbで、しかもドアの键の上でパスワードを设置しました.明らかに、パスワードを見つけてこそ鍵を開け、教室に入ることができる.このパスワードのセットはXYZのメンバーによってlovekeyと呼ばれています.幸いなことに、楓氷葉はlovekeyがaの10進数値とbの10進数値の和のXYZ-26進数形式であることを知っている.もちろんエビや水域の浪子もカエデの氷の葉を難しくしたくないので、aとbの桁数は200位を超えません.例えば、第1セットの試験データa=0*26^5+0*26^4+0*26^3+0*26^2+3*26+7=85 b=1*26^2+2*26+4=732ではa+b=817=BFL
Inputテーマには複数のテストデータがあります.各テストデータのセットには、2つの値がXYZ-26進数であり、各数字の各桁には大文字のみが含まれ、各数字は200桁を超えない.
OutputはXYZのlovekeyを出力し、各グループの出力が1行を占める.
Sample Input AAAADH BCE DRW UHD D AAAAA
Sample Output BFL XYZ D
典型的な大数加算問題は、26進数を10進数に変換して加算し、その後変換すればいいと思う人もいますが、文字列は最大200ビットです.26200は大きな数で、longもlongもlongも記憶できないので、この問題はいつもの考え方で、大きな数を加算します.
#include<iostream>
#include <string.h>
#include <cstdio>
#define N 202
using namespace std;
char a[N], b[N], c[N];
void rever(char *a)
{
    int len = strlen(a);
    char t;
    for(int i = 0; i < len/2; i++)
    {
        t = a[i];
        a[i] = a[len - 1 - i];
        a[len - 1 - i] = t;
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.txt", "r", stdin);
#endif
    int i, j, k, len1, len2, len, up;
    while(~scanf("%s%s", a, b))
    {
        memset(c, 0, sizeof(c));
        len1 = strlen(a);
        len2 = strlen(b);
        len = (len1 > len2 ? len1 : len2);
        rever(a);
        rever(b);
        for (i = 0; i < len; i++)
        {
            if (i >= len1)
            {
                a[i] = 'A';
            }
            if (i >= len2)
            {
                b[i] = 'A';
            }
        }
        up = 0;
        for (i = 0; i <len || up; i++)
        {
            if (i < len1)   up += a[i] - 'A';
            if(i < len2)    up += b[i] - 'A';
            c[i] = 'A' + up % 26;
            up /= 26;
        }
        c[i] = '\0';
        for (i = len; i >= 0 && (c[i] == 'A' || c[i] == 0); i--);
        if (i < 0)
        {
            cout << "A" << endl;
            continue;
        }
        for(;i >= 0; i--)
        {
            printf("%c", c[i]);
        }
        cout << endl;
    }
    return 0;
}