1. 程式人生 > >pat乙級1048. 數字加密(20)

pat乙級1048. 數字加密(20)

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