PAT乙级1048

212 阅读2分钟

题目

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

输入格式

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

输出格式

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

思路

这道题需要对字符串操作比较熟悉。首先需要一个字符串s:string s = {"0123456789JQK"};,用他来为输出的答案字符串res添砖加瓦。通过遍历对奇数偶数位的字符分别处理,注意,因为遍历第一位是从0开始的,所以奇偶其实是反过来的。
因为题目条件:这里令个位为第1位。这里令个位为第 1 位。,所以要对输入的字符串a,b反过来处理,从而输出res的时候也要反转一下才能输出。从样例可以看出,a,b的位数不一定相同,所以我们要对位数少的进行补足处理,补0.

//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;

/*
J 代表 10、Q 代表 11、K 代表 12
对奇数位,对应位的数字相加后对 13 取余
用 B 的数字减去 A 的数字,若结果为负数,则再加 10
*/

string a,b;//100位用string存
string s = {"0123456789JQK"};
string res;
char ch;

int main(){
    cin >> a >> b;
    //以个位为第一位,用reverse转置
    int lenb = b .size(),lena = a.size();//根据样例,a,b位数对不上,需要补足0
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    if (lena > lenb)
        b.append(lena - lenb, '0');
    // else
    //     a.append(lenb - lena, '0');
    for(int i = 0; i < a.size(); i++){
        int temp;
        if(i % 2 == 0)//奇数
            temp = (a[i] - '0' + b[i] - '0') % 13;
        else{//偶数
            temp = b[i] - a[i];
            if(temp < 0)
                temp += 10;
        }
        res += s[temp];
    }
    // for (int i = res.length() - 1; i >= 0; i--)
    //     cout << res[i];
    reverse(res.begin(),res.end());
    cout << res << endl;
    return 0;
}
//3695Q8118
//1234567 368782971

题目链接