1. 程式人生 > >PAT乙級練習題B1048. 數字加密

PAT乙級練習題B1048. 數字加密

題目描述

本題要求實現一種數字加密方法。首先固定一個加密用正整數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];