题目: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 }
总结:
做题首先是要看懂题,其次要审题,否则后续付出的时间都是无效的。