码迷,mamicode.com
首页 > 其他好文 > 详细

PAT B1048 数字加密

时间:2019-08-26 15:29:17      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:std   处理   mda   ==   ret   数字   奇数   pat   code   

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 数字加密

标签:std   处理   mda   ==   ret   数字   奇数   pat   code   

原文地址:https://www.cnblogs.com/mrdragon/p/11412189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!