题目
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式
在一行中输出加密后的结果。
思路
这道题需要对字符串操作比较熟悉。首先需要一个字符串s:string s = {"0123456789JQK"};,用他来为输出的答案字符串res添砖加瓦。通过遍历对奇数偶数位的字符分别处理,注意,因为遍历第一位是从0开始的,所以奇偶其实是反过来的。
因为题目条件:,所以要对输入的字符串a,b反过来处理,从而输出res的时候也要反转一下才能输出。从样例可以看出,a,b的位数不一定相同,所以我们要对位数少的进行补足处理,补0.
//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
/*
J 代表 10、Q 代表 11、K 代表 12
对奇数位,对应位的数字相加后对 13 取余
用 B 的数字减去 A 的数字,若结果为负数,则再加 10
*/
string a,b;//100位用string存
string s = {"0123456789JQK"};
string res;
char ch;
int main(){
cin >> a >> b;
//以个位为第一位,用reverse转置
int lenb = b .size(),lena = a.size();//根据样例,a,b位数对不上,需要补足0
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
if (lena > lenb)
b.append(lena - lenb, '0');
// else
// a.append(lenb - lena, '0');
for(int i = 0; i < a.size(); i++){
int temp;
if(i % 2 == 0)//奇数
temp = (a[i] - '0' + b[i] - '0') % 13;
else{//偶数
temp = b[i] - a[i];
if(temp < 0)
temp += 10;
}
res += s[temp];
}
// for (int i = res.length() - 1; i >= 0; i--)
// cout << res[i];
reverse(res.begin(),res.end());
cout << res << endl;
return 0;
}
//3695Q8118
//1234567 368782971