题目:
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
解题思路:
这题其实并不算太难,但还是卡了很久,主要就是补全和奇数位偶数位的判断。如果是从右向左来做判断,就很容易解了
三种情况:(设cmp为加密用的串,str为需要加密的串,ans为加密后的串)
①cmp.size()>str.size(); 在str前面补'0'至与cmp.size()相等 ;如000123
②cmp.size()<str.size() 同上,补全cmp
③cmp.size()==str,size() 直接做运算
那么下面要注意的就是奇数位和偶数位的判断
001234567
368782971
补全后从右向左数,第一位为奇数位......
代码如下:
//数字加密
#include <iostream>
#include <string>
using namespace std;
//12345678921 368782971
int main(){
string cmp; //匹配串
string str; //需要加密的串
string ans; //最总结果
cin>>cmp;
cin>>str;
while (cmp.size()<str.size()){
cmp = '0'+ cmp; //在原字符串前面补0,也可以用字符串相加的方法,最后swap()
}
while(cmp.size()>str.size()){
str = '0' + str;
}
for(int i=1;i<=cmp.size();i++){
if(i%2==1){ //奇数位
int temp = (cmp[cmp.size()-i]-48+str[cmp.size()-i]-48)%13;
if(temp==10){
ans='J'+ans;
}else if(temp==11){
ans='Q'+ans;
}else if(temp==12){
ans= 'K'+ans;
}else{
ans= (char)('0'+temp)+ans;
}
}else{
int temp1 = str[cmp.size()-i]-cmp[cmp.size()-i];
if(temp1<0){
temp1+=10;
}
ans= (char)('0'+temp1) + ans;
}
}
cout<<ans<<endl;
return 0;
}