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

我们看到题目详细地描述了计算过程/操作步骤, 所以需要做的是将题目给定步骤翻译为代码即可。

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

Table of Contents

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

PAT乙级BasicLevelPractice 1031

问题分析

我们看到题目详细地描述了计算过程/操作步骤, 所以需要做的是将题目给定步骤翻译为代码即可。

计算规则

  1. 给定一个18位的身份证, 一组权重(17个值)
  2. 用身份证前17位分别乘以对应的权重, 并且求和
  3. 将求得的和, 对11取模得到值Z
  4. 根据给定的Z值到M值的映射表, 将取模得到的Z值映射为对应的M值
  5. 检查M值是否等于身份证号第18位

完整描述步骤

  1. 获取输入的身份证个数
  2. 依次获取身份证号 ID_number
  3. 按照计算规则计算出M值并且进行对比
  4. 如果M值不等于身份证号第18位, 则输出该错误的身份号
  5. 如果所有号码都正常(设置计数器统计), 则输出"All passed"

伪代码描述

  1. get input case_amount;
  2. set weights = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; set mapping = [1 0 X 9 8 7 6 5 4 3 2] set wrong_ID_number_amount = 0;
  3. for (i = 0; i < case_amount; i++):
    • get ID_number;
    • sum(ID_number[j] * weights[j]) (0 <= j < 17);
    • Z = sum % 11
    • M = mapping[Z];
    • if M != ID_number[17]: print(ID_number) wrong_ID_number_amount += 1
  4. if wrong_ID_number_amount == 0: print("All passed")

完整提交代码

/*
# 问题分析
我们看到题目详细地描述了计算过程/操作步骤, 所以需要做的是将题目给定步骤翻译为代码即可。
 
# 计算规则
1. 给定一个18位的身份证, 一组权重(17个值)
2. 用身份证前17位分别乘以对应的权重, 并且求和
3. 将求得的和, 对11取模得到值Z
4. 根据给定的Z值到M值的映射表, 将取模得到的Z值映射为对应的M值
5. 检查M值是否等于身份证号第18位
 
# 完整描述步骤
1. 获取输入的身份证个数
2. 依次获取身份证号 ID_number
3. 按照计算规则计算出M值并且进行对比
4. 如果M值不等于身份证号第18位, 则输出该错误的身份号
5. 如果所有号码都正常(设置计数器统计), 则输出"All passed"
 
# 伪代码描述
1. get input case_amount;
2. set weights = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    set mapping = [1 0 X 9 8 7 6 5 4 3 2]
    set wrong_ID_number_amount = 0;
3. for (i = 0; i < case_amount; i++):
    - get ID_number;
    - sum(ID_number[j] * weights[j]) (0 <= j < 17);
    - Z = sum % 11
    - M = mapping[Z];
    - if M != ID_number[17]:
        print(ID_number)
        wrong_ID_number_amount += 1
4. if wrong_ID_number_amount == 0:
    print("All passed")
*/
 
 
# include<stdio.h>
 
int main(){
    int case_amount;
    scanf("%d\n", &case_amount);
 
    char verified_codes[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
    int weights[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
 
    char ID_number[19];
    int invalid_ID_number_amount = 0;
    for (int i = 0; i < case_amount; i++){
        scanf("%s\n", ID_number);
        int sum = 0;
        for (int i = 0; i < 17; i++){
            sum += ((int)ID_number[i] - 48) * weights[i];
        }
        if (verified_codes[sum % 11] != ID_number[17]){
            printf("%s\n", ID_number);
            invalid_ID_number_amount++;
        }
    }
 
    if (invalid_ID_number_amount == 0)
        printf("All passed");
 
    return 0;
}
「PAT乙级真题解析」Basic Level 1031 查验身份证 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果