pat乙级 1048 数字加密
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例1:
1234567 368782971
输出样例1:
3695Q8118
总结:
题目的意思是:字符串长度较少的需要补0 比如A:123456 B:123
则在作数字加减的时候,B需要补零 A:123456 B:000123
所以分三种情况:
1 A的长度比B的长度大
余下的字符为A的字符,如果为偶数位,用 B 的数字减去 A 的数字,则要用 0减去A的数字 如果小于零 则+10
if (a.size() > b.size()){
stack<char> s;
for (int i = max_size - 1; i >= 0; i--){
if ((max_size - i) % 2 != 0 && max_size - i <= min_size){
int yushu = ((a[i] - '0') + (b[i - (max_size - min_size)] - '0')) % 13;
if (yushu < 10){
char c = yushu + '0';
s.push(c);
}
else
{
if (yushu == 10){
s.push('J');
}
else if (yushu == 11){
s.push('Q');
}
else if (yushu == 12){
s.push('K');
}
}
}
else if ((max_size - i) % 2 == 0 && max_size - i <= min_size){
int min = (b[i - (max_size - min_size)] - '0') - (a[i] - '0');
if (min < 0){
min += 10;
}
char c = min + '0';
s.push(c);
}
else if (max_size - i > min_size){
if((max_size - i) % 2 != 0)
s.push(a[i]);
else{
int min=0-(a[i]-'0');
if(min<0){
min+=10;
}
char c=min+'0';
s.push(c);
}
}
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
2 B的长度比A的长度大
余下的字符为B的字符,直接进栈即可
else if (a.size() < b.size()){
stack<char> s;
for (int i = max_size - 1; i >= 0; i--){
if ((max_size - i) % 2 != 0 && max_size - i <= min_size){
int yushu = ((a[i-(max_size-min_size)] - '0') + (b[i] - '0')) % 13;
if (yushu < 10){
char c = yushu + '0';
s.push(c);
}
else
{
if (yushu == 10){
s.push('J');
}
else if (yushu == 11){
s.push('Q');
}
else if (yushu == 12){
s.push('K');
}
}
}
else if ((max_size - i) % 2 == 0 && max_size - i <= min_size){
int min = (b[i] - '0') - (a[i - (max_size - min_size)] - '0');
if (min < 0){
min += 10;
}
char c = min + '0';
s.push(c);
}
else if (max_size - i > min_size){
s.push(b[i]);
}
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
3 A的长度与B的长度相等
else
{
stack<char> s;
for (int i = max_size - 1; i >= 0; i--){
if ((max_size - i) % 2 != 0 ){
int yushu = ((a[i] - '0') + (b[i] - '0')) % 13;
if (yushu < 10){
char c = yushu + '0';
s.push(c);
}
else
{
if (yushu == 10){
s.push('J');
}
else if (yushu == 11){
s.push('Q');
}
else if (yushu == 12){
s.push('K');
}
}
}
else if ((max_size - i) % 2 == 0 ){
int min = (b[i] - '0') - (a[i] - '0');
if (min < 0){
min += 10;
}
char c = min + '0';
s.push(c);
}
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
AC代码:
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
#include<stack>
using namespace std;
int main(){
string a, b;
cin >> a >> b;
int max_size = max(a.size(), b.size());
int min_size = min(a.size(), b.size());
if (a.size() > b.size()){
stack<char> s;
for (int i = max_size - 1; i >= 0; i--){
if ((max_size - i) % 2 != 0 && max_size - i <= min_size){
int yushu = ((a[i] - '0') + (b[i - (max_size - min_size)] - '0')) % 13;
if (yushu < 10){
char c = yushu + '0';
s.push(c);
}
else
{
if (yushu == 10){
s.push('J');
}
else if (yushu == 11){
s.push('Q');
}
else if (yushu == 12){
s.push('K');
}
}
}
else if ((max_size - i) % 2 == 0 && max_size - i <= min_size){
int min = (b[i - (max_size - min_size)] - '0') - (a[i] - '0');
if (min < 0){
min += 10;
}
char c = min + '0';
s.push(c);
}
else if (max_size - i > min_size){
if((max_size - i) % 2 != 0)
s.push(a[i]);
else{
int min=0-(a[i]-'0');
if(min<0){
min+=10;
}
char c=min+'0';
s.push(c);
}
}
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
else if (a.size() < b.size()){
stack<char> s;
for (int i = max_size - 1; i >= 0; i--){
if ((max_size - i) % 2 != 0 && max_size - i <= min_size){
int yushu = ((a[i-(max_size-min_size)] - '0') + (b[i] - '0')) % 13;
if (yushu < 10){
char c = yushu + '0';
s.push(c);
}
else
{
if (yushu == 10){
s.push('J');
}
else if (yushu == 11){
s.push('Q');
}
else if (yushu == 12){
s.push('K');
}
}
}
else if ((max_size - i) % 2 == 0 && max_size - i <= min_size){
int min = (b[i] - '0') - (a[i - (max_size - min_size)] - '0');
if (min < 0){
min += 10;
}
char c = min + '0';
s.push(c);
}
else if (max_size - i > min_size){
s.push(b[i]);
}
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
else
{
stack<char> s;
for (int i = max_size - 1; i >= 0; i--){
if ((max_size - i) % 2 != 0 ){
int yushu = ((a[i] - '0') + (b[i] - '0')) % 13;
if (yushu < 10){
char c = yushu + '0';
s.push(c);
}
else
{
if (yushu == 10){
s.push('J');
}
else if (yushu == 11){
s.push('Q');
}
else if (yushu == 12){
s.push('K');
}
}
}
else if ((max_size - i) % 2 == 0 ){
int min = (b[i] - '0') - (a[i] - '0');
if (min < 0){
min += 10;
}
char c = min + '0';
s.push(c);
}
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
system("pause");
return 0;
}