1048 數字加密 (20分)
阿新 • • 發佈:2020-08-05
題目
本題要求實現一種數字加密方法。首先固定一個加密用正整數 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]] ; } }