PAT乙1048 數字加密

2021-10-02 19:47:58 字數 1758 閱讀 8825

本題要求實現一種數字加密方法。首先固定乙個加密用正整數 a,對任一正整數 b,將其每 1 位數字與 a 的對應位置上的數字進行以下運算:對奇數字,對應位的數字相加後對 13 取餘——這裡用 j 代表 10、q 代表 11、k 代表 12;對偶數字,用 b 的數字減去 a 的數字,若結果為負數,則再加 10。這裡令個位為第 1 位。

輸入在一行中依次給出 a 和 b,均為不超過 100 位的正整數,其間以空格分隔。

在一行中輸出加密後的結果。

1234567 368782971
3695q8118
題目要注意的是,位數是從右向左數的,如果另外乙個數的位數為空,則預設為0進行處理。由於字串是從後向前進行比較的,所以用逆序的方式更加方便進行比較,然後把短一點的字串進行補0,按照要求進行計算即可。

有個小的細節,題目沒有說,測試點也沒有,如果最後的答案是好多個0000組成的,究竟該輸出乙個0還是多個0。我把2個方法都提交測試了,都可以通過。因為刷pat乙題目坑碰的多了,所以一旦有0這類數字,都會考慮一下,不過這題好像沒留這個坑。**我寫了2個,不做翻轉的,和做翻轉的都寫了乙個,個人認為,還是翻轉一下,感覺思路更清晰一些,不翻轉的寫起來感覺有點燒腦。

#include #include using namespace std;

int main()

; string a, b, output;

int max = 0;

cin >> a >> b;

int num_a = a.length();

int num_b = b.length();

reverse(a.begin(), a.end());

reverse(b.begin(), b.end());

if (num_a > num_b)

else

for (int i = 0; i <= a.length(); i++)

if (((i + 1) % 2) != 0)//為奇數時

output += ch[(a[i] - '0' + b[i] - '0') % 13];

else if ((b[i] - a[i]) < 0)

output += b[i] - a[i] + 10 + '0';

else

output += b[i] - a[i] + '0';

for (int i = a.length()-1; i >= 0; i--)

cout << output[i];

return 0;

}

#include #include using namespace std;

char ch[13] = ;

char odd(char a, char b)

char even(char a, char b)

int main()

if (num_a)

while (num_a)

if (num_b)

while (num_b)

step--;

/* for (int i = step; i >= 0; i--)//注釋的**是將多個0合成乙個0的寫法 }

if (!flag)

cout << "0";

*/for (int i = step; i >= 0; i--)

cout << output[i];

return 0;

}

PAT 1048 數字加密

本題要求實現一種數字加密方法。首先固定乙個加密用正整數a,對任一正整數b,將其每1位數字與a的對應位置上的數字進行以下運算 對奇數字,對應位的數字相加後對13取餘 這裡用j代表10 q代表11 k代表12 對偶數字,用b的數字減去a的數字,若結果為負數,則再加10。這裡令個位為第1位。輸入格式 輸入...

PAT 1048數字加密

include include include include using namespace std int main min alen for int i 0 i min i elseelse reverse b.begin b.end cout 有乙個坑就是,如果b比a短,需要補齊,在網上搜了...

PAT 1048 數字加密

題目連線 思路 首先,題目給出a與b均為不超過100位的,而int型顯然不夠這麼多位,肯定採用大數方法,即採用字串輸入,通過int型陣列倒序儲存。例如 輸入 1234567 這用string輸入每乙個均為char型,然後申請int型陣列倒序 即變為7654321 這裡的每一位是int型 可直接進行加...