「PAT乙级真题解析」Basic Level 1048 数字加密 (问题分析+完整步骤+伪代码描述+提交通过代码)

题目要求按照步骤进行计算, 并输出计算结果。 这种明确给出计算步骤的题目妥妥的"模拟题", 明确题设要求的计算步骤后, 翻译成代码即可。

#算法#数据结构#需求分析#pat考试#c语言

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT乙级BasicLevelPractice 1048

问题分析

题目要求按照步骤进行计算, 并输出计算结果。 这种明确给出计算步骤的题目妥妥的"模拟题", 明确题设要求的计算步骤后, 翻译成代码即可。

加密步骤

以"1234567"和"368782971"为例, 加密过程为:

A        0 0 1 2 3 4 5 6 7 
B        3 6 8 7 8 2 9 7 1
Result   3 6 9 5 Q 8 1 1 8
1. 先将A和B通过将较小的数高位补0使得两个数可以对齐
2. 然后从开始按照奇数位偶数位规则计算

完整描述步骤

  1. 获取输入: A和B
  2. 补齐A和B的长度
  3. 从最后一位开始, 按照规则计算

伪代码描述

  1. get input: A, B
  2. if length(A) < length(B):
    • fill 0 for A else if length(A) > length(B):
    • fill 0 for B
  3. for each odd position:
    • result[odd] = (A[odd] + B[odd]) % 13
    • if result[odd] > 9:
      • map result[odd]
  4. for each even position:
    • result[even] = B[even] - A[even]
    • if result[event] < 0:
      • result[even] += 10

完整提交代码

/*
# 问题分析
题目要求按照步骤进行计算, 并输出计算结果。
这种明确给出计算步骤的题目妥妥的"模拟题", 明确题设要求的计算步骤后, 翻译成代码即可。
 
# 加密步骤
以"1234567"和"368782971"为例, 加密过程为:
A        0 0 1 2 3 4 5 6 7 
B        3 6 8 7 8 2 9 7 1
Result   3 6 9 5 Q 8 1 1 8
1. 先将A和B通过将较小的数高位补0使得两个数可以对齐
2. 然后从开始按照奇数位偶数位规则计算
 
# 完整描述步骤
1. 获取输入: A和B
2. 补齐A和B的长度
3. 从最后一位开始, 按照规则计算
 
# 伪代码描述
1. get input: A, B
2. if length(A) < length(B):
    - fill 0 for A
   else if length(A) > length(B):
    - fill 0 for B
3. for each odd position:
    - result[odd] = (A[odd] + B[odd]) % 13
    - if result[odd] > 9:
        - map result[odd]
4. for each even position:
    - result[even] = B[even] - A[even]
    - if result[event] < 0:
        - result[even] += 10
*/
 
 
# include<stdio.h>
 
int main() {
  char A[101];
  char B[101];
  char result[101];
  scanf("%s %s", &A, &B);
  char signals[] = {'0', '1', '2', '3', '4', '5', '6',
                    '7', '8', '9', 'J', 'Q', 'K'};
 
  int A_size, B_size, max_size;
  for (A_size = 0; A[A_size]; A_size++)
    ;
  for (B_size = 0; B[B_size]; B_size++)
    ;
 
  if (A_size > B_size) {
    max_size = A_size;
    int offset = A_size - B_size;
    for (int i = B_size - 1; i >= 0; i--) {
      B[i + offset] = B[i];
    }
    for (int i = 0; i < offset; i++) {
      B[i] = '0';
    }
    B[A_size] = 0;
  } else if (A_size < B_size) {
    max_size = B_size;
    int offset = B_size - A_size;
    for (int i = A_size - 1; i >= 0; i--) {
      A[i + offset] = A[i];
    }
    for (int i = 0; i < offset; i++) {
      A[i] = '0';
    }
    A[B_size] = 0;
  }
 
  for (int i = max_size - 1; i >= 0; i = i - 2) {
    result[i] = signals[((A[i] - '0') + (B[i] - '0')) % 13];
  }
 
  int difference;
  for (int i = max_size - 2; i >= 0; i = i - 2) {
    difference = (B[i] - '0') - (A[i] - '0');
    if (difference < 0) {
      difference += 10;
    }
    result[i] = signals[difference];
  }
  result[max_size] = 0;
  printf("%s\n", result);
  return 0;
}
「PAT乙级真题解析」Basic Level 1048 数字加密 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果