题目描述
本题要求实现一种数字加密方法。
首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A的对应位置上的数字进行以下运算:
对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表12;
对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。
这里令个位为第 1 位。
输入格式
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式
在一行中输出加密后的结果。
输入样例
1234567 368782971
输出样例
3695Q8118
解题思路
首先,将正整数A和正整数B分别读入字符数组a和b中,并获取各字符串长度lenA和lenB,lenAns等于lenA和lenB中较大值。
其次,考虑lenA和lenB之间的三种大小关系:
退出for循环时,i < 0 && j < 0
flag用于控制奇数位和偶数位执行不同运算。
退出for循环时,i > 0 && j < 0
继续执行while(i >= 0){…}
退出for循环时,i < 0 && j > 0
继续执行while(j >= 0){…}
最后,循环输出数组ans的字符。
参考代码
#include
#include
using namespace std;
// 整数数A, 整数B, 结果
char a[110], b[110], ans[110];
// 映射数组
char c[13] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};
int main()
{
scanf("%s", a);
// 读入空格
getchar();
scanf("%s", b);
// 字符长度
int lenA = strlen(a);
int lenB = strlen(b);
int lenAns = lenA > lenB ? lenA : lenB;
int i = lenA - 1, j = lenB - 1, k = lenAns - 1;
// 控制奇偶数位执行不同运算
bool flag = false;
// 每次一位运算后对应的下标
int t;
// lenA == lenB
for(; i >= 0 && j >= 0;i--, j--, k--)
{
if(!flag)
{
t = ((a[i] - '0') + (b[j] - '0')) % 13;
}
else {
t = b[j] - a[i];
if (t < 0)
t += 10;
}
ans[k] = c[t];
flag = !flag;
}
// lenA > lenB
while (i >= 0)
{
if(!flag)
{
t = (a[i] - '0') % 13;
}
else
{
t = '0' - a[i];
if(t < 0)
t += 10;
}
ans[k] = c[t];
flag = !flag;
i--;
k--;
}
// lenA < lenB
while(j >= 0)
{
if(!flag)
{
t = (b[j] - '0') % 13;
}
else
{
t = b[j] - '0';
if(t<0)
t += 10;
}
ans[k] = c[t];
flag = !flag;
j--;
k--;
}
// 输出结果
for(int i = 0; i < lenAns; i++)
{
printf("%c", ans[i]);
}
return 0;
}