PAT乙級練習題B1048. 數字加密
阿新 • • 發佈:2019-01-27
題目描述
本題要求實現一種數字加密方法。首先固定一個加密用正整數A,對任一正整數B,將其每1位數字與A的對應位置上的數字進行以下運算:對奇數位,對應位的數字相加後對13取餘——這裡用J代表10、Q代表11、K代表12;對偶數位,用B的數字減去A的數字,若結果為負數,則再加10。這裡令個位為第1位。
輸入格式:
輸入在一行中依次給出A和B,均為不超過100位的正整數,其間以空格分隔。
輸出格式:
在一行中輸出加密後的結果。
輸入樣例:
1234567 368782971
輸出樣例:
3695Q8118
題目解析
需要考慮A和B不等長,開始我以為是按照B的長度輸出,如果A不夠長就補零,太長就裁掉;後來發現是按照A和B中最長的來輸出,把短的補零到和長的一樣長。
程式碼
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
string A, B, C;
cin >> A >> B;
int z = A.size() - B.size();
string zeros(abs(z), '0');
if (A.size() > B.size())
{
B = zeros + B;
}
if (B.size() > A.size())
{
A = zeros + A;
}
for (int i = B.size() - 1,j=1; i >= 0; --i,++j)
{
int b = B[i] - '0', a = A[i] - '0',c;
char ch;
if (j % 2 == 1)
{
c = (a + b) % 13;
switch (c)
{
case 10:
ch = 'J';
break;
case 11:
ch = 'Q';
break;
case 12 :
ch = 'K';
break;
default:
ch = '0' + c;
break;
}
}
else
{
c = b - a;
if (c < 0)
{
c += 10;
}
ch = '0' + c;
}
C = ch + C;
}
cout << C << endl;
system("pause");
return 0;
}
程式碼簡化
可以將13進位制數的表示部分的程式碼進行簡化。
c = (a + b) % 13;
switch (c)
{
case 10:
ch = 'J';
break;
case 11:
ch = 'Q';
break;
case 12:
ch = 'K';
break;
default:
ch = '0' + c;
break;
}
替換成
string thi = "0123456789JQK";
c = (a + b) % 13;
ch = thi[c];