1. 程式人生 > >1048 數字加密(20分)

1048 數字加密(20分)

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

 

個人感覺寫的還是比較簡單的