「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)。任务是验证身份证号码的合法性。
校验规则
-
权重系数:将身份证的前17位数字依次乘以以下权重系数:
7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2。 -
加权求和:将每位数字与对应权重相乘后求和。
-
取模计算:将总和对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
-
合法性判断:若计算出的校验码与身份证号码最后一位匹配,则为合法,否则为非法。
输入格式
- 第一行:正整数N(≤100),表示输入的身份证号码数量。
- 接下来的N行:每行输入一个18位的身份证号码。
输出格式
- 如果某个身份证号码校验失败,按输入顺序输出该号码。
- 如果所有号码都合法,输出All passed。
解题思路
- 读取输入:逐行读取所有身份证号码。
- 校验前17位是否为数字:排除非数字字符。
- 计算校验码:根据规则计算校验结果。
- 输出结果:输出非法号码或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]
}
代码详解
- 输入处理:逐行读取身份证号码并验证格式。
- 加权求和与校验码计算:根据权重系数和余数映射表计算校验码。
- 结果输出:若有非法号码即输出,否则输出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
- 0回答
- 1粉丝
- 0关注
相关话题
- 「Mac玩转仓颉内测版16」PTA刷题篇7 - L1-007 念数字
- 「Mac玩转仓颉内测版35」PTA刷题篇14 - L1-014 简单题
- 「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
- 「Mac玩转仓颉内测版11」PTA刷题篇2 - L1-002 打印沙漏
- 「Mac玩转仓颉内测版15」PTA刷题篇6 - L1-006 连续因子
- 「Mac玩转仓颉内测版33」PTA刷题篇12 - L1-012 计算指数
- 「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号
- 「Mac玩转仓颉内测版18」PTA刷题篇9 - L1-009 N个数求和
- 「Mac玩转仓颉内测版19」PTA刷题篇10 - L1-010 比较大小
- 「Mac玩转仓颉内测版20」PTA刷题篇11 - L1-011 A-B
- 「Mac玩转仓颉内测版34」PTA刷题篇13 - L1-013 计算阶乘和
- 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
- 「Mac玩转仓颉内测版13」PTA刷题篇4 - L1-004 计算摄氏温度
- 「Mac玩转仓颉内测版17」PTA刷题篇8 - L1-008 求整数段和
- 「Mac玩转仓颉内测版36」PTA刷题篇15 - L1-015 跟奥巴马一起画方块