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; }
個人感覺寫的還是比較簡單的