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

题目规定了一个概念: 正整数A的"DA部分", 给定四个正整数, A, DA, B, DB, 需要输出A的DA部分与B的DB部分的和. 这种给定具体规则/定义/概念的, 将对应规则用变成语言翻译成代码即可.

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

Table of Contents

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

PAT乙级BasicLevelPractice 1016

问题分析

题目规定了一个概念: 正整数A的"DA部分", 给定四个正整数, A, DA, B, DB, 需要输出A的DA部分与B的DB部分的和. 这种给定具体规则/定义/概念的, 将对应规则用变成语言翻译成代码即可.

正整数A的"DA部分"

DA是一位整数, 所以根据DA的取值, 可以有正整数A的"0部分", 正整数A的"1部分", ..., 正整数A的"9部分" 正整数A的"DA部分", 即正整数A各个数位值等于DA的部分排列得到的新数值。 比如"1231234"的"2部分"就是"22", "3部分"就是"33", "4部分"就是"4". 其实就是检查A中有多少个DA, 新的数就由多少个DA组成。

完整描述步骤

  1. 读入数据A、DA、B、DB
    • 因为需要遍历A各个数位上的数字, 所以存储成字符串会便于循环遍历
    • 因为遍历A时需要将各个数位上的数字跟DA对比, 所以DA存储成字符会便于比较
  2. 循环访问A各个数位上的数字, 如果等于DA, 计数器+1
  3. 生成 整数位数等于计数器数值, 且各个数位上的数字都是DA的数, 这个数就是PA
  4. 同理生成PB
  5. 输出PA+PB

伪代码描述步骤

  1. get input string A, char DA, string B, char B;

  2. set PA = 0; set PB = 0;

  3. for digit in A:

    • if digit == DA: PA = PA * 10 + DA;
  4. for digit in B:

    • if digit == DB: PB = PB * 10 + DB;
  5. print outoput: PA + PB

完整提交代码

/*
# 问题分析
题目规定了一个概念: 正整数A的"DA部分", 给定四个正整数, A, DA, B, DB, 
需要输出A的DA部分与B的DB部分的和. 这种给定具体规则/定义/概念的, 将对应规则用变成语言翻译成代码即可.
 
## 正整数A的"DA部分"
 
DA是一位整数, 所以根据DA的取值, 可以有正整数A的"0部分", 正整数A的"1部分", ..., 正整数A的"9部分"
正整数A的"DA部分", 即正整数A各个数位值等于DA的部分排列得到的新数值。
比如"1231234"的"2"部分就是"22". 其实就是检查A中有多少个DA, 新的数就由多少个DA组成。
 
# 完整描述步骤
1. 读入数据A、DA、B、DB
    - 因为需要遍历A各个数位上的数字, 所以存储成字符串会便于循环遍历
    - 因为遍历A时需要将各个数位上的数字跟DA对比, 所以DA存储成字符会便于比较
2. 循环访问A各个数位上的数字, 如果等于DA, 计数器+1
3. 生成 整数位数等于计数器数值, 且各个数位上的数字都是DA的数, 这个数就是PA
4. 同理生成PB
5. 输出PA+PB
 
# 伪代码描述步骤
1. get input string A, char DA, string B, char B;
2. set PA = 0; set PB = 0;
3. for digit in A:
    - if digit == DA: PA = PA * 10 + DA;
4. for digit in B:
    - if digit == DB: PB = PB * 10 + DB;
    
5. print outoput: PA + PB
 
*/
 
# include <stdio.h>
 
int main(){
    char A[11];
    char B[11];
    int DA;
    int DB;
    
    scanf("%s %d %s %d", A, &DA, B, &DB);
    
    int PA = 0;
    int PB = 0;
    
    int digit;
    for (int i = 0; A[i]; i++){
        digit = (int)A[i] - (int)'0';
        if (digit == DA){
            PA = PA * 10 + digit;
        }
    }
    for (int i = 0; B[i]; i++){
        digit = (int)B[i] - (int)'0';
        if (digit == DB){
            PB = PB * 10 + digit;
        }
    }
    
    printf("%d", PA+PB);
    return 0;
}