1048 数字加密 (20分)
题目
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
解析
输入两个字符串,如果加密用数A长度大于B,需要再B前面补0;加密过程中从后往前,用k表示当前是奇数位还是偶数位,将计算结果保存在re数组里边,用r表示re得位数如果加密用数A长度小于B,则只对B的后strlen(A)位加密,比A长的原封不动放到re里边,样例就是这种情况
然后根据事先准备好的P字符串P,输出P[re[i]],即可
答案
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
char P[] = "0123456789JQK";
int main(){
char s1[101],s2[101];
int re[101];
cin >> s1 >> s2;
int len1 = strlen(s1);
int len2 = strlen(s2);
int i = len1 ,k = 1,r = 0;
if(len1 > len2){
int L = len1 - len2;
for(int i = 0 ; i <len1 ; i ++){
s2[len1 - i] = s2[len2 -i];
}
for(int i = 0 ; i < L ; i ++){
s2[i] = '0';
}
len2 = len1;
}
while(i > 0){
if(k % 2 != 0){//奇数位
re[r++] = (s1[len1 - k] + s2[len2 - k] - '0' * 2) % 13;
}else{//偶数位
int a = s2[len2 - k] - s1[len1 - k] ;
if(a < 0) a += 10 ;
re[r++] = a;
}
k ++;
i --;
}
int j = len2 - len1;
while(j > 0) re[r++] = s2[--j] - '0';//B长的部分直接搬过来
for(int i = r-1 ; i >= 0 ; i--){
cout << P[re[i]] ;
}
}

浙公网安备 33010602011771号