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

居民身份证是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语言

```c #include <stdio.h> #include <ctype.h> int validateID(char *id) { 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 (!isdigit(id[i])) { return 0; } sum += (id[i] - '0') * weights[i]; } char last = id[17]; int lastValue; if (last == 'X' || last == 'x') { lastValue = 10; } else if (isdigit(last)) { lastValue = last - '0'; } else { return 0; } sum += lastValue * weights[17]; return (sum % 11 == 1); } int main() { int n; scanf("%d", &n); getchar(); // 读取换行符 int count = 0; char id[19]; // 18位身份证号 + '\0' for (int i = 0; i < n; i++) { fgets(id, sizeof(id), stdin); id[17] = '\0'; // 确保只读取前18个字符 if (validateID(id)) { count++; } } printf("%d\n", count); return 0; } ``` 1. 权重数组的索引与身份证号字符位置要严格对应,权重数组长度必须为18。 2. 校验最后一位字符时需要同时处理数字和'X'/'x'的情况。 3. 输入处理时要注意换行符的影响,使用getchar()或适当处理缓冲区。 [2025-05-18 21:24:01 | AI写代码神器 | 418点数解答]

相关提问