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;
}
标签:Basic,PAT,res,sum,1048,ori,char,oriLen,加密
From: https://www.cnblogs.com/tacticKing/p/17246576.html