1048 数字加密(PAT 乙级 C++实现)

1048 数字加密(20)(20 point(s))

本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。

输入格式:

输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。

输出格式:

在一行中输出加密后的结果。

输入样例:

1234567 368782971

输出样例:

3695Q8118

分析:

注意A和B不同长度时,高位当 '0' 处理。

详细代码:

#include <iostream>  
#include <stack>
#include <string>
using namespace std;    
  
// 1048 数字加密(20)(20 point(s))
int main(void){   
	char str[]={'0','1','2','3','4','5','6','7','8','9','J','Q','K'}; 
	stack<char> s;
	string a,b;
	cin>>a>>b;
	  
	int x,k=0;   
	int i=a.size()-1,j=b.size()-1;
	for(;i>=0 && j>=0;--i,--j){
		++k;
		if(k%2){
			x = (b[j]-'0')+(a[i]-'0'); 
		}else{
			x = b[j]-a[i];
			if(x<0){
				x += 10;
			} 
		}
		s.push(str[x%13]);
	}

	while(i>=0){
		++k;
		if(k%2){
			x = a[i]-'0';  // 短的为 '0'
		}else{
			x = '0'-a[i];
			if(x<0){
				x += 10;
			} 
		}
		--i;
		s.push(str[x%13]);  
	}
	while(j>=0){
		++k;
		if(k%2){
			x = b[j]-'0'; 
		}else{
			x = b[j]-'0';
			if(x<0){
				x += 10;
			} 
		}
		--j;
		s.push(str[x%13]);  
	}

	while(!s.empty()){  // 出栈
		cout<<s.top();
		s.pop();  
	}

	return 0;
}// jinzheng 2018.7.23 12:48

猜你喜欢

转载自blog.csdn.net/guangjinzheng/article/details/81166241
今日推荐