输入身份证号码, 判断 18 位身份证号码是否合法, 并查询信息(性别, 出生日期, 归属地)
不同语言版本的身份证信息查询,带合法性检验。各版本均将纯校验逻辑与**归属地查询(读取 data.json)**分离,便于单元测试,并对错误输入(长度、非数字、校验码不符)做了健壮性处理。
| 语言 | 运行 | 测试 |
|---|---|---|
| C | cd c && make && ./query 431025197610125362 |
make test |
| Python | cd python3 && python3 query.py 431025197610125362 |
python3 -m unittest |
| Node.js | cd nodejs && node query.js 431025197610125362 |
node --test |
| JavaScript (浏览器) | 在 javascript/ 起静态服务器后打开 index.html |
核心逻辑与 Node.js 版一致 |
| Go | cd golang && go run . 431025197610125362 |
go test ./... |
| Rust | cd rust && cargo run -- 431025197610125362 |
cargo test |
| TypeScript | cd typescript && node src/query.ts 431025197610125362 |
node --test src/idcard.test.ts |
TypeScript 直接由 Node.js(>=22) 的类型擦除运行,无需编译;类型检查可执行
npm install && npm run typecheck。
所有语言的单测共用以下用例:
| 号码 | 结果 |
|---|---|
431025197610125362 |
合法,女,19761012,湖南省临武县 |
110101199001010015 |
合法,男,19900101,北京市东城区 |
11010119900101100X / ...100x |
合法,校验码 X 大小写均接受 |
431025197610125361 |
不合法(校验码不匹配) |
12345 |
不合法(长度错误) |
A31025197610125362 |
不合法(前 17 位含非数字) |
- 将前面的身份证号码 17 位数分别乘以不同的系数, 从第一位到第十七位的系数分别为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
- 将这 17 位数字和系数相乘的结果相加.
- 用加出来和除以 11, 看余数是多少?
- 余数只可能有 <0 1 2 3 4 5 6 7 8 9 10> 这 11 个数字, 其分别对应的最后一位身份证的号码为 <1 0 X 9 8 7 6 5 4 3 2>.
- 通过上面得知如果余数是 2,就会在身份证的第 18 位数字上出现罗马数字的 Ⅹ。如果余数是 10,身份证的最后一位号码就是 2.
例如: 某男性的身份证号码是 34052419800101001X, 我们要看看这个身份证是不是合法的身份证.
首先: 我们得出, 前 17 位的乘积和是 189.
然后: 用 189 除以 11 得出的余数是 2.
最后: 通过对应规则就可以知道余数 2 对应的数字是 X. 所以, 这是一个合格的身份证号码.