1. 程式人生 > 實用技巧 >1048 數字加密 (20分)

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]] ;
    }
}