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]] ;
    }
}
posted @ 2020-08-05 18:42  小马小马最可爱  阅读(196)  评论(0)    收藏  举报