PAT Basic 1048. 数字加密

发布时间 2023-03-23 10:42:27作者: 十豆加日月

PAT Basic 1048. 数字加密

1. 题目描述:

本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。

2. 输入格式:

输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。

3. 输出格式:

在一行中输出加密后的结果。

4. 输入样例:

1234567 368782971

5. 输出样例:

3695Q8118

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

除草题,考察基础IO,但是第一次提交testpoint2,5报wrong answer,检查了逻辑感觉没问题。。。最后还是参考了大佬的题解:PAT-Basic-1048. 数字加密 – Lnyan's Blog (llonely.com)

这里有个bug点就是当正整数B的长度小于密钥A时,是需要在B前面补0的,也就是说A的每一位都必须被用到。一开始我写的是直接忽略A多余的位,也算题目描述不清晰吧。。。

另外一个细节是最后不需要res[oriLen] = '\0';也可以正常输出,应该是char res[101] = "";初始化时已经将所有的字节置0了。

My Code:

#include <stdio.h>
#include <string.h> // strlen header

// first submit testpoint2, 5 wrong answer.
int main(void)
{
    char elem[3] = {'J', 'Q', 'K'};
    char key[101] = "";
    char ori[101] = "";
    char res[101] = "";
    char temp[101] = "";
    int flag = 0; // 0 means odd bit, 1 means even bit
    //char *pKey = NULL, *pOri = NULL, *pRes = NULL;
    int keyLen = 0, oriLen = 0;
    int i=0, j=0;
    int sum=0;
    
    scanf("%s%s", key, ori);
    keyLen = strlen(key);
    oriLen = strlen(ori);
    
//     if(oriLen == 0)
//     {
//         printf("\n");
//         return 0;
//     }
    
    // to pass testpoint2, 5
    if(oriLen < keyLen) // need add '0' at the header of ori[]
    {
        //void *memcpy(void *str1, const void *str2, size_t n)
        memcpy(temp, ori, oriLen);
        memcpy(ori+(keyLen-oriLen), temp, oriLen);
        for(i=0; i<keyLen-oriLen; ++i)
        {
            ori[i] = '0';
        }
        oriLen = keyLen;
    }
    
    for(i=keyLen-1, j=oriLen-1; i>=0 && j>=0; --i, --j)
    {
        if(flag) // even bit
        {
            flag = 0;
            sum = ((ori[j]-'0') - (key[i]-'0'));
            if(sum < 0) sum+=10;
            res[j] = sum+'0';
        }
        else // odd bit
        {
            flag = 1;
            sum = ((key[i]-'0') + (ori[j]-'0')) % 13;
            if(sum>9)
            {
                res[j] = elem[sum-10];
            }
            else
            {
                res[j] = sum+'0';
            }
        }
    }
    
    for( ; j>=0; --j) // oriLen > keyLen
    {
        res[j] = ori[j];
    }
    
    //res[oriLen] = '\0';
    
    printf("%s\n", res);
    
    
    return 0;
}