PAT (Basic Level) Practice (中文)1048 數字加密 (20 分)(C++)

1048 數字加密 (20 分)

本題要求實現一種數字加密方法。首先固定一個加密用正整數 A,對任一正整數 B,將其每 1 位數字與 A 的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加後對 13 取餘——這裏用 J 代表 10、Q 代表 11、K 代表 12;對偶數位,用 B 的數字減去 A 的數字,若結果爲負數,則再加 10。這裏令個位爲第 1 位。

輸入格式:

輸入在一行中依次給出 A 和 B,均爲不超過 100 位的正整數,其間以空格分隔。

輸出格式:

在一行中輸出加密後的結果。

輸入樣例:

1234567 368782971
輸出樣例:

3695Q8118


#include <cstdio>
#include <cstring>
#include <cmath>

int main()
{
    char A[102] = {0}, B[102] = {0}, C[102] = {0};
    char S[15] = "0123456789JQK";//字符串,表示0~9,J~K
    scanf("%s %s", A, B);
    int lenA = strlen(A), lenB = strlen(B);
    int len = lenA < lenB ? lenA : lenB;
    int i = 0, j = 0, k = 0;//k爲C的下標
    for(i = 1; i<=len; i++, k++)//相同部分
    {
        if(i%2) C[k] = S[(A[lenA-i] + B[lenB-i] - '0' - '0')%13];//奇數位
        else//偶數位
        {
            int temp = B[lenB-i] - A[lenA-i];//二者相減可以省去同時減‘0’
            C[k] = S[temp<0?temp+10:temp];
        }
    }
    for(j = i; j<=lenA; j++, k++)//A的剩下幾位
    {
        if(j%2) C[k] = A[lenA-j];
        else
        {
            int temp = A[lenA-j] -'0';
            C[k] = S[!temp?0:10 - (A[lenA-j] -'0')];
        }
    }
    for(j = i; j<=lenB; j++, k++) C[k] = B[lenB-j];//B的剩下幾位,還是B本身
    while(k) printf("%c", C[--k]);//逆序輸出即可
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章