适合初步练习PAT乙级——(1048) 数字加密
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
int lena = a.length(), lenb = b.length();
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if (lena > lenb)
b.append(lena - lenb, '0');
else
a.append(lenb - lena, '0');
vector<char>c;
for (int i = 0; i < a.length(); i++) {
if (i % 2 == 0) {
char T;
int t = ((a[i] - '0') +( b[i] - '0')) % 13;
if (t == 10) {
T = 'J';
}
else if (t == 11)
T = 'Q';
else if (t == 12)
T = 'K';
else
T = t+48;
c.push_back(T);
}else {
int temp = b[i] - a[i];//字符相减为对应的ASCLL码相减
if (temp < 0)temp = temp + 10;
c.push_back(temp+48);
}
}
for (int i =b.length()-1; i>=0; i--) {
printf("%c", c[i]);
}
return 0;
}
思路:
首先将a和b倒置,将字符串a和b中较短的那个末尾添加0直到两个字符串长度相等,然后从0开始依次处理每一位,如果当前是奇数位(i%2==0)则将a[i]的数字加上b[i]的数字再对13取余,结果添加在字符串c的末尾;如果是偶数位,计算b[i]和a[i]的差值,如果小于0就加10,然后将结果添加在字符串c的末尾,最后倒序输出字符串c。
另外有个小知识点,整形转化位字符,字符加上48。