PAT乙级真题1048 || 数字加密(详解,C/C++示例,测试点分析)

微信公众号:计算机黑科学大全
【欢迎关注微信公众号:计算机黑科学大全,对话框回复: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;
}

微信号:aiyoutao76

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值