本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。

输入格式:

输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。

输出格式:

在一行中输出加密后的结果。

输入样例:

  1. 1234567 368782971

输出样例:

  1. 3695Q8118

这题有个坑

如图所示:

B1048 数字加密 - 图1

如果两个string的长度不一样,短的那一个string要在前面补0;


思路

借鉴了网上和书上的许多例子,我是这样处理的:

  1. 找到stringA和stringB的长度

  2. 找到最大长度 MAX

  3. 处理字符串,从左往右 (i = 0; i < MAX; i++)

    • 处理前导0的问题
      设 valueA = lengthA + i - MAX
      若 valueA < 0, 则 valueA = 0
      否则 valueA = stringA[lengthA + i - MAX];
      ——->同理处理stringB
  4. 展示结果

    • 我是处理一个,展示一个

      1. 判断奇偶


        • 直接按照题意输出;


        • putchar((valueB - valueA + 10 ) % 10 + ‘0’);


代码

  1. #include<cstdio>
  2. #include<cstring>
  3. const char oddBit[13] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K'};
  4. int main() {
  5. char strA[101], strB[101];
  6. scanf("%s %s", strA, strB);
  7. // Find the length of each string
  8. int lengthA = strlen(strA);
  9. int lengthB = strlen(strB);
  10. int lengthMAX = lengthA > lengthB ? lengthA : lengthB;
  11. for(int i = 0; i < lengthMAX; i++) {
  12. // Deal with the problem about zero
  13. int valueA = lengthA + i - lengthMAX;
  14. int valueB = lengthB + i - lengthMAX;
  15. if(valueA < 0) {
  16. valueA = 0;
  17. }
  18. else {
  19. valueA = strA[lengthA + i - lengthMAX] - '0';
  20. }
  21. if(valueB < 0) {
  22. valueB = 0;
  23. }
  24. else {
  25. valueB = strB[lengthB + i - lengthMAX] - '0';
  26. }
  27. // Display the result
  28. if((lengthMAX - i) % 2 != 0) { // Odd bits
  29. putchar(oddBit[(valueA + valueB) % 13]);
  30. }
  31. else { // Even bits
  32. putchar((valueB - valueA + 10 ) % 10 + '0');
  33. }
  34. }
  35. return 0;
  36. }