PAT 1048. 数字加密

本题要求实现一种数字加密方法。首先固定一个加密用正整数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;
}

猜你喜欢

转载自blog.csdn.net/xiao_chen_l/article/details/79944264