1048 數字加密(20分)
阿新 • • 發佈:2018-11-04
1048 數字加密 (20 分)
本題要求實現一種數字加密方法。首先固定一個加密用正整數 A,對任一正整數 B,將其每 1 位數字與 A 的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加後對 13 取餘——這裡用 J 代表 10、Q 代表 11、K 代表 12;對偶數位,用 B 的數字減去 A 的數字,若結果為負數,則再加 10。這裡令個位為第 1 位。
輸入格式:
輸入在一行中依次給出 A 和 B,均為不超過 100 位的正整數,其間以空格分隔。
輸出格式:
在一行中輸出加密後的結果。
輸入樣例:
1234567 368782971
輸出樣例:
3695Q8118
做題時出現的問題:
首先,我用了to_string()函式把數字轉換成字串,最後只通過兩個測試點,但是我認為沒問題,
就一直在A的長度和B的長度糾結,改來改去還是兩個測試點,於是就上網看大佬程式碼,把to_string()換成了
陣列,然後就只有一個測試點沒有通過,再後來我通過輸入資料用自己的程式碼和別人的程式碼做對比,不管怎麼輸入
感覺答案都是對的啊,然後偶然間把B為0的情況輸了進去,然後答案不對,我就鬆了一口氣,終於找到問題了
後來一檢查發現是給B補全0的位數出了問題,我把A.length()-B.length()+1改成了i=B.length();i<A.length()
然後測試了下資料,沒問題,提交以下,測試點全部過去
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string A;
string B;
int num;
char ref[13] = {'0','1','2','3','4','5','6','7','8','9','J','Q','K'};
string c = "";
cin>>A>>B;
if(B.length()<A.length()){ // 補全位數 B小於A
for(int i=B.length();i<A.length();i++){
B = "0"+B;
}
}
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
for(int i=0;i<A.length();i++){
if((i+1)%2!=0){
num = ((A[i]-'0'+B[i]-'0')%13);
c += ref[num];
}else{
num = B[i]-A[i];
if(num<0)num += 10;
c += ref[num];
}
}
if(A.length()<B.length()){ //補全位數B大於A
for(int i=A.length();i<B.length();i++){
c += B[i];
}
}
reverse(c.begin(),c.end());
cout<<c;
return 0;
}
個人感覺寫的還是比較簡單的