```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点数解答]