「Mac玩转仓颉内测版37」PTA刷题篇16 - L1-016 查验身份证

2024-12-01 17:55:35
18次阅读
0个评论
最后修改时间:2024-12-02 20:21:44

本篇将讲解PTA平台上的题目 L1-016 查验身份证,通过处理身份证号码的校验,进一步提升Cangjie编程语言在字符串处理与数据验证方面的能力。


关键词
  • PTA刷题
  • 身份证校验
  • 字符串处理
  • 数据验证
  • Cangjie语言

一、L1-016 查验身份证

题目描述
身份证号码由17位数字和1位校验码组成。前17位数字依次表示出生日期、地区等信息,第18位是校验码。校验码可以是数字0-9,也可以是字符X(表示10)。任务是验证身份证号码的合法性。


校验规则

  1. 权重系数:将身份证的前17位数字依次乘以以下权重系数:
    7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2

  2. 加权求和:将每位数字与对应权重相乘后求和。

  3. 取模计算:将总和对11取模,结果对应以下校验码表:

    Z:  0  1  2  3  4  5  6  7  8  9  10  
    M:  1  0  X  9  8  7  6  5  4  3   2
    
  4. 合法性判断:若计算出的校验码与身份证号码最后一位匹配,则为合法,否则为非法


输入格式

  • 第一行:正整数N(≤100),表示输入的身份证号码数量。
  • 接下来的N行:每行输入一个18位的身份证号码。

输出格式

  • 如果某个身份证号码校验失败,按输入顺序输出该号码。
  • 如果所有号码都合法,输出All passed

解题思路
  1. 读取输入:逐行读取所有身份证号码。
  2. 校验前17位是否为数字:排除非数字字符。
  3. 计算校验码:根据规则计算校验结果。
  4. 输出结果:输出非法号码或All passed

代码实现
package cjcDemo

import std.console.*
import std.convert.*

// 权重和校验码映射表
let weights: Array<Int64> = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
let check_codes: Array<UInt8> = [49, 48, 88, 57, 56, 55, 54, 53, 52, 51, 50]

main(): Unit {
    // 读取身份证数量
    let count: Int64 = Int64.parse(Console.stdIn.readln().getOrThrow())
    var all_passed: Bool = true

    // 循环校验每个身份证号码
    for (_ in 0..count) {
        let id_number: String = Console.stdIn.readln().getOrThrow()
        if (!validateId(id_number)) {
            all_passed = false
            println(id_number)  // 输出不合法的身份证号码
        }
    }

    // 如果所有身份证号码都合法
    if (all_passed) {
        println("All passed")
    }
}

// 验证身份证号码的函数
func validateId(id_number: String): Bool {
    // 校验长度是否为18位
    if (id_number.size != 18) {
        return false
    }

    var weighted_sum: Int64 = 0

    // 计算前17位的加权和
    for (i in 0..id_number.size - 1) {
        let current_char = id_number[i]
        if (!Rune(current_char).isAsciiNumber()) {
            return false
        }
        weighted_sum += Int64(UInt32(current_char) - UInt32(r'0')) * weights[i]
    }

    // 计算校验码并比对
    let check_index = weighted_sum % 11
    return id_number[id_number.size - 1] == check_codes[check_index]
}

代码详解
  1. 输入处理:逐行读取身份证号码并验证格式。
  2. 加权求和与校验码计算:根据权重系数和余数映射表计算校验码。
  3. 结果输出:若有非法号码即输出,否则输出All passed

示例执行

示例 1
输入:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出:

12010X198901011234
110108196711301866
37070419881216001X

示例 2
输入:

2
320124198808240056
110108196711301862

输出:

All passed

小结

本篇通过实现 L1-016 查验身份证 题目,展示了Cangjie编程语言在处理字符串和数据验证方面的能力。通过身份证号码的校验,巩固了基本的算法设计与字符串操作技巧。


下篇预告

下一篇将进入 「Mac玩转仓颉内测版38」小学奥数篇1 - 如何平分6个苹果和4个橘子,通过数学逻辑题目提升问题分析与解决能力,敬请期待!


上一篇: 「Mac玩转仓颉内测版36」PTA刷题篇15 - L1-015 跟奥巴马一起画方块

下一篇: 「Mac玩转仓颉内测版38」小学奥数篇1 - 如何平分6个苹果和4个橘子


作者:SoraLuna 链接:https://www.nutpi.net 來源:坚果派 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


收藏00

登录 后评论。没有帐号? 注册 一个。