本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。
输入格式:
输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:1234567 368782971输出样例:
3695Q8118
不知道有没有朋友遇到我掉的这个坑,它的判断奇偶数的下表是从右边开始的,我从左边数一直有大约一半的测试点通不过,原来是奇数测试数据时是对的偶数个时候就不对了||--||成功避开B串短于A串和A串短于B串的坑,没想到陷入了这个清奇的大坑。
#include <iostream>
#include <string.h>
#include <cmath>
using namespace std;
void trans(char *s,int n[],int a,int b,bool f){
int k=0;
int t=0;
if(((a<b)&&f)||((a>b)&&(!f))){
t=abs(b-a);
while(k<t){
n[k]=0;
k++;
}
}
k=0;
while(s[k]!='\0'){
n[k+t]=s[k]-48;
k++;
}
}
int main(){
int A[102];
int B[102];
char a[102];
char b[102];
scanf("%s%s",&a,&b);
int la=strlen(a);
int lb=strlen(b);
trans(a,A,la,lb,true);
trans(b,B,la,lb,false);
int maxx;
if(la>lb){
maxx=la;
}
else{
maxx=lb;
}
int i=0;
int result[102];
while(i<maxx){
if((maxx-i)%2==1){
result[i]=A[i]+B[i];
if(result[i]>=13){
result[i]=result[i]%13;
}
}
else{
result[i]=B[i]-A[i];
if(result[i]<0){
result[i]+=10;
}
}
i++;
}
for(int i=0;i<maxx;i++){
if(result[i]>=0&&result[i]<=9){
printf("%d",result[i]);
}
else if(result[i]==10){
printf("J");
}
else if(result[i]==11){
printf("Q");
}
else if(result[i]==12){
printf("K");
}
}
return 0;
}