本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1, str2;
cin >> str1 >> str2;
int length1 = str1.length();
int length2 = str2.length();
int tmp = length2 - length1;
int i = 0, j = 0;
int flag = 0;
if (tmp >= 0) {
if (length1 % 2)
flag = 1;
for (; j < tmp; j++)
cout << str2[j];
}
else {
tmp = -tmp;
if (length1 % 2)
flag = 1;
for (; i < tmp; i++){
if(flag){
cout << str1[i];
flag = 0;
}
else{
cout << (10 - str1[i] + '0') % 10; // 当A中多余部分为0时,要考虑其差为 10 的情况
flag = 1;
}
}
}
for (; i < length1 && j < length2; i++, j++) {
if (flag) {
tmp = (str1[i] + str2[j] - '0' - '0') % 13;
switch (tmp) {
case 10: cout << "J"; break;
case 11: cout << "Q"; break;
case 12: cout << "K"; break;
default: cout << tmp;
}
flag = 0;
}
else {
tmp = str2[j] - str1[i];
if (tmp < 0)
tmp += 10;
cout << tmp;
flag = 1;
}
}
cout << endl;
}