1048 数字加密 (20 分)

题目:1048 数字加密 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

1234567 368782971

输出样例:

3695Q8118

思路:

  • 首先要看懂题目的输出怎么回事。第几位虽然是倒着看的,但是输出中的结果是正着来的。按题目的说法A中的第一位是7,B中的第一位是1,加密结果位8,这个8是放在最后一位的而不是第一位。给的案例中,B比A长,虽然要加密的是A,但是加密结果的长度是和B一样的,这就说明了加密的数字长度是由A、B两者中长度最长的决定的。根据输出样例,前两位数字和B的前两位是一样的,可见长度不够的补0处理加密。(其实也可以认为多出的长度部分直接作为输出处理)。
  • A、B加密数位反着来用reverse()函数事倍功半。
    reverse()用法:

      reverse(it,it2) 可以将数组指针在 it~it2 之间的元素,或容器的迭代器在 it1~it2 范围内的所有元素进
    行反转。注意: it~it2 是左闭右开区间。

    int a[10] = {10,11,12,13,14,15};
    reverse(a, a+4); // 将a[0]到a[3]这4个元素反转
    for (int i = 0; i < 6; i ++) printf("%d ", a[i]); // 输出13 12 11 10 14 15
    string str = "abcdefghi";
    reverse(str.begin()+2, str.begin()+6);
    cout << str << endl; // 输出abfedcghi
  • 得到的结果需要反转才能回到原先顺序。所谓负负得正~

代码:

补0处理代码(直接输出处理的可以自己尝试下):

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cctype>
 4 #include <iostream>
 5 #include <sstream>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <string>
 9 #include <stack>
10 #include <queue>
11 #include <vector>
12 #include <map>
13 using namespace std;
14 
15 int main()
16 {
17     string a, b, r;
18     cin >> a >> b;
19     reverse(a.begin(), a.end());
20     reverse(b.begin(), b.end());
21     if(a.length() < b.length())
22     {
23         int len = b.length() - a.length();
24         for(int i = 0; i < len; i++)
25             a += '0';
26     }
27     else if(a.length() > b.length())
28     {
29         int len = a.length() - b.length();
30         for(int i = 0; i < len; i++)
31             b += '0';
32     }
33     int len = a.length();
34     for(int i = 0; i < len; i++)
35     {
36         if(i % 2 == 0)
37         {
38             int t = (a[i] - '0' + b[i] - '0') % 13;
39             if(t == 10)
40                 r += 'J';
41             else if(t == 11)
42                 r += 'Q';
43             else if(t == 12)
44                 r += 'K';
45             else
46                 r += t + '0';
47         }
48         else
49             r += (b[i] - a[i] + 10) % 10 + '0';
50     }
51     reverse(r.begin(), r.end());
52     cout << r << endl;
53     return 0;
54 }

 

总结:

  做题首先是要看懂题,其次要审题,否则后续付出的时间都是无效的。

上一篇:华登区块狗APP系统开发现成


下一篇:SDNU 1048.石子合并2(区间合并)