【欢迎关注微信公众号:计算机黑科学大全,对话框回复:PAT乙级真题】获取全部真题详解及代码示例
个人博客地址:https://mzwang.top
数字加密
题目描述:
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。写程序找出冠军队。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例1:
1234567 368782971
输出样例1:
3695Q8118
输入样例2:
1234567 782971
输出样例2:
15Q8118
题目来源:PAT乙级1048
作者:CHEN, Yue
单位:浙江大学
问题解决:
解题思想
一开始看本题时感觉思路很简单,代码实现也很简单,直到提交时发现测试点2和5出错才知道有坑。原题只给了输入输出样例1,仅从样例1我们可能只能推出 B 比 A 长时长出的部分原样输出即可,相当于没加密。但是 A 比 B 长时该怎样处理呢?可能我们就不得而知了。其实题目的真正意思是这样的:若 B 比 A 长则 A 前面补0直到与 B 等长(对于此题,此情况可以忽视,想一下为什么?),若 A 比 B 长则 B 前面补0直到与A等长,然后再进行加密。如果仅从题目描述和样例1来判断,我们可能不太容易能得出这样的题意,那么本题的难点就可以说是题目描述不清楚了,这可能类似很多其它乙级题目的坑。
坑点提醒
测试点2和5答案错误,这两个测试点都是 A 比 B 长的情况,处理好了就通过了。
代码示例(C/C++)
小提示:请将以下代码保存为.cpp
格式(C++程序)左右滑动代码以查看完整代码(复制本文链接到电脑端浏览效果更佳)
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 101;
int main()
{
char a[maxn],b[maxn];
scanf("%s%s",a,b);
int j = strlen(a) - 1,flag = 1; //flag来判断奇偶位
for(int i = strlen(b) - 1; j >= 0&&i >= 0; i--,j--){
if(flag % 2){
int temp = (a[j] - '0' + b[i] - '0') % 13;
if(temp >= 10){
switch(temp)
{
case 10:
b[i] = 'J';break;
case 11:
b[i] = 'Q';break;
case 12:
b[i] = 'K';
}
}
else{
b[i] = temp + '0';
}
}
else{
int temp = b[i] - a[j];
if(temp < 0){
temp += 10;
}
b[i] = temp + '0';
}
flag++;
}
flag += j; //此处很关键,要得出下标为0处是处于奇数位还是偶数位
for(int k = 0;k <= j; k++){ //A比B长时长出的部分从前往后输出
if(flag % 2){ //且若A比B长,B的相应位置均为0
printf("%d",(a[k] - '0') % 13);
}
else{
int temp = '0' - a[k];
printf("%d",temp < 0?temp + 10:temp);
}
flag--;
}
printf("%s\n",b);
return 0;
}