酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

用C语言,居民身份证是18位字符的编码,每个人的编码都是唯一的,校验规则如下: ∑(ai*wi)mod 11 = 1 i表示号码字符从左至右包括校验码字符在内的位置序号;ai表示第i位置上的号码字符值;Wi表示第i位置上的加权因子。即将各位上的数值乘上位权之和对11取余,余数为1则表示该编码正确。注意:如果最后一位校验码是“X”或“x”,则代表该校验码的数值为10。 各位的权值依次是:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1 例如某身份证号码为:370683198901117657,这是正确的编码。 又比如身份证号:43038120051120041X,这是正确的编码, 还比如身份证号:150402200002010020,这是正确的编码。 又如某号码为:470683198902117657,这是错误的编码。 格式 输入格式 第一行是一个数字n(1≤n≤150),表示后面有n个号码需要判断 从第二行起,每行一个18位的字符串,表示要判断的身份证号码,一共有n行 输出格式 输出一个整数值,表示正确的身份证号码的个数

```c #include <stdio.h> #include <string.h> int checkIdCard(char idCard[]) { int weights[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1}; int sum = 0; for (int i = 0; i < 17; i++) { if (idCard[i] >= '0' && idCard[i] <= '9') { sum += (idCard[i] - '0') * weights[i]; } } char checkCode = idCard[17]; if (checkCode >= '0' && checkCode <= '9') { sum += (checkCode - '0'); } else if (checkCode == 'X' || checkCode == 'x') { sum += 10; } return (sum % 11 == 1); } int main() { int n; scanf("%d", &n); char idCard[19]; int count = 0; for (int i = 0; i < n; i++) { scanf("%s", idCard); if (checkIdCard(idCard)) { count++; } } printf("%d\n", count); return 0; } // 额外需要注意的逻辑点: // 1. 输入的身份证号码长度必须严格为 18 位。 // 2. 对于输入的号码字符,要做好错误输入的处理,比如包含非数字和 'X' 或 'x' 以外的字符。 // 3. 在计算加权和时,要注意数据类型的范围,防止溢出。 ``` [2025-05-15 21:59:17 | AI写代码神器 | 435点数解答]

相关提问