pat乙級1048. 數字加密(20)
阿新 • • 發佈:2019-01-28
1048. 數字加密(20)
時間限制400 ms記憶體限制65536 kB
程式碼長度限制8000 B
判題程式Standard作者CHEN, Yue
本題要求實現一種數字加密方法。首先固定一個加密用正整數A,對任一正整數B,將其每1位數字與A的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加後對13取餘——這裡用J代表10、Q代表11、K代表12;對偶數位,用B的數字減去A的數字,若結果為負數,則再加10。這裡令個位為第1位。
輸入格式:
輸入在一行中依次給出A和B,均為不超過100位的正整數,其間以空格分隔。
輸出格式:
在一行中輸出加密後的結果。
輸入樣例:1234567 368782971輸出樣例:
3695Q8118
演算法設計:
用字串讀入兩個整數A和B,並直接通過B來記錄最後輸出結果。如果直接遍歷就需要定義兩個索引分別從A字串和B字串的末位開始向前遍歷,為了編碼方便,不妨先將A,B字串進行翻轉。這樣就可以只定義一個索引從開始位遍歷即可。遍歷過程中按要求操作,並將結果記錄在B字串相應位置,最後將B字串輸出即可。
注意點:
(1)字串下標從0開始,而題目中個位從1開始編號,所以對於奇數位偶數位的處理要反過來
(2)字串A和字串B的長度有可能出現A長度大於B長度的情況,要特別處理
(3)如果A字串長於B字串,最後需要在B字串末位補'\0'字元,因為在操作過程中B字串以前的'\0'字元被覆蓋了
c++程式碼:
#include<bits/stdc++.h> using namespace std; int main(){ char A[105],B[105]; char trans[14]="0123456789JQK"; scanf("%s %s",A,B); int Alen=strlen(A),Blen=strlen(B); //翻轉A、B字串 reverse(A,A+Alen); reverse(B,B+Blen); int len=max(Alen,Blen);//取A、B字串中最長的長度 for(int i=0;i<len;++i){ int numA=i<Alen?A[i]-'0':0;//記錄相應A字串位置的數字,如果超過了A的長度,記0 int numB=i<Blen?B[i]-'0':0;//記錄相應B字串位置的數字,如果超過了B的長度,記0 //字串下標從0開始,而題目中個位從1開始編號,所以對於奇數位偶數位的處理要反過來 if(i%2==0) B[i]=trans[(numA+numB)%13]; else{ int t=numB-numA; if(t<0) t+=10; B[i]=t+'0'; } } B[len]='\0';//在B字串末位補'\0'字元 reverse(B,B+len);//翻轉B字串 puts(B);//輸出 return 0; }