PAT B1048 数字加密

Posted mrdragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT B1048 数字加密相关的知识,希望对你有一定的参考价值。

PAT B1048 数字加密

题目描述:

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

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

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

  输入样例:
  1234567 368782971

  输出样例:
  3695Q8118

参考代码:

 1 /****************************************************
 2 PAT B1048 数字加密
 3 ****************************************************/
 4 #include <iostream>
 5 #include <string.h>
 6 
 7 using namespace std;
 8 
 9 const char MOD_RESOULT[] =  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, J, Q, K ;
10 
11 int main() 
12     string key, num;
13 
14     cin >> key >> num;
15 
16     string ans = num.size() >= key.size() ? num : key;        //此处仅仅是为了让ans的长度等于key与num中最长的
17 
18     for (int i = 0; i < num.size() || i < key.size(); ++i) 
19         //如果出现key和num长度不同的情况需要给较短的那个补‘0’
20         char numInKey = i >= key.size() ? 0 : key[key.size() - 1 - i];
21         char numInNum = i >= num.size() ? 0 : num[num.size() - 1 - i];
22 
23         if (i % 2 == 0) 
24             ans[ans.size() - 1 - i] = MOD_RESOULT[(numInKey + numInNum - 2 * 0) % 13];
25         
26         else 
27             int n = numInNum - numInKey;
28             ans[ans.size() - 1 - i] = n < 0 ? MOD_RESOULT[n + 10] : MOD_RESOULT[n];
29         
30     
31 
32     cout << ans;
33 
34     return 0;
35 

注意事项:

  1:本题有个很“坑”的地方:A、B的长度不一致,需要给长度不够进行补‘0’。答案的长度和A、B中最长的长度相同;另外在B比较长的情况下直接令ans = B,在for循环中i < A、B的最小长度为边界调节得出来的结果也是正确的,但是当A的长度比较长的时候这样做就不正确了!

  2:之前出错的时候查了好多其他人的代码,基本上都是先将A、B反转在处理,最后再将结果反转,怎么说呢,感觉并没有这个必要。

以上是关于PAT B1048 数字加密的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1048. 数字加密

PAT 1048. 数字加密(20)

PAT-乙级-1048 数字加密

PAT 1048 数字加密(字符串)

PAT 乙级 1048 数字加密

PAT乙级1048 数字加密 (20 分)