PAT乙級—1048. 數字加密(20)-native
阿新 • • 發佈:2018-12-23
本題要求實現一種數字加密方法。首先固定一個加密用正整數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一樣長才行。若A
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string A,tB;
cin>>A>>tB;
int len1=A.size();
int len2=tB.size();
int max=len1>len2?len1:len2;
char C[max];
string B="";
if(len1>len2){ //如果A比B長,長多少則補幾個0
for(int i=0 ;i<len1-len2;i++)
B+='0';
}
B+=tB;//補在左邊
for(int i=B.size()-1,j=A.size()-1;i>=0&&j>=0;i--,j--){
if((B.size()-i)%2==0){ //從右邊起如果是偶數位
if(B[i]-A[j]<0){//B的數字減去A的數字也就是字元相減
C[i]=(B[i]-A[j])+10+'0';//判斷完是否小於0之後轉換成字元
}else {
C[i]=B[i]-A[j]+'0';//大於0則直接轉換成字元
}
}else{ //如果是奇數位
if((B[i]-'0'+A[j]-'0')%13==10)//先將對應位轉換成數字再對13取餘
C[i]='J';
else if((B[i]-'0'+A[j]-'0')%13==11)
C[i]='Q';
else if((B[i]-'0'+A[j]-'0')%13==12)
C[i]='K';
else {
C[i]=(B[i]-'0'+A[j]-'0')%13+'0';
}
}
}
for(int i=0;i<len2-len1;i++)//若A>B,將不變的元素賦值過來
C[i]=B[i];
for(int i=0;i<max;i++){
cout<<C[i];
}
return 0;
}
題目連結: