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反转在处理,最后再将结果反转,怎么说呢,感觉并没有这个必要。
原文地址:https://www.cnblogs.com/mrdragon/p/11412189.html
时间: 2024-10-09 23:23:41