PAT 1048デジタル暗号化(20)

3862 ワード

点数をつける...この問題では、デジタル暗号化方法を実現する必要があります.まず暗号化用の正の整数Aを固定し、いずれかの正の整数Bに対して、その1桁の数字とAの対応する位置の数字を以下の演算を行う:奇数桁に対して、対応する桁の数字を加算した後に13に対して残りを取る--ここではJで10、Qで11、Kで12を表す;対偶数ビットは、Bの数字からAの数字を減算し、結果が負数であれば10を加算します.ここでは順位を1位にします.
入力形式:
1行にAとBの順に入力し、いずれも100ビットを超えない正の整数で、その間をスペースで区切ります.
出力フォーマット:
暗号化された結果を1行に出力します.入力サンプル:1234567 368782971
出力サンプル:3695 Q 8118
テストコード:
void PAT1048(){
    string A, B;
    string C;
    A = "1234567"; B = "368782971";
    int lenA = A.length(); int lenB = B.length();
    int k =1,m=lenA-1;
    int a = 0, b = 0,tmp=0;
    for (int i = lenB-1; i >= 0; --i){
        if (m>= 0){
            b = B[i] - '0'; a = A[m--] - '0';
            if (k % 2 == 0){
                tmp = b - a;
                if (tmp >=0)C.push_back(tmp+'0');
                else C.push_back((tmp+10)+'0');
                ++k;
            }
            else{
                tmp = b + a;
                tmp = tmp % 13;
                if (tmp>= 10){
                    if (tmp == 10)C.push_back('J');
                    else if (tmp == 11)C.push_back('Q');
                    else  C.push_back('K');
                }
                else C.push_back(tmp+'0');
                ++k;
            }
        }
        else break;
    }
    if (lenB > lenA){
        for (int i = lenB - lenA - 1; i >= 0; --i)C.push_back(B[i]);
    }
    else if (lenB < lenA){
        for (int i = lenA - lenB - 1; i >= 0; --i)C.push_back(A[i]);
    }

    int lenV = C.length();
    for (int i = lenV - 1; i >= 0; --i){
        cout << C[i];
    }
}