whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

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

Posted on 2019-10-01 In PAT

数字加密

题目描述

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

输入格式

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

输出格式

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

输入样例1

1
1234567 368782971

输出样例1

1
3695Q8118

输入样例2

1
1234567 782971

输出样例2

1
15Q8118

问题解决

解题思想

一开始看本题时感觉思路很简单,代码实现也很简单,直到提交时发现测试点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++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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;
}

题目来源:PAT乙级1048
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1047 || 编程团体赛(详解,C/C++示例,测试点分析)
PAT乙级1049 || 数列的片段和(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 数字加密
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例1
    5. 1.5. 输出样例1
    6. 1.6. 输入样例2
    7. 1.7. 输出样例2
    8. 1.8. 问题解决
      1. 1.8.1. 解题思想
      2. 1.8.2. 坑点提醒
      3. 1.8.3. 代码示例(C/C++)
© 2021 Mengzhao Wang