本題要求實現一種數字加密方法。首先固定乙個加密用正整數 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型 可直接進行加...