PTA_L1-016 查验身份证 (15分)
发布日期:2021-05-14 16:34:36 浏览次数:12 分类:精选文章

本文共 1703 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要验证身份证号码的校验码有效性。校验码的计算规则是对前17位数字按特定权重求和,然后对11取模得到一个值Z,最后根据Z值确定校验码M。我们需要检查每个身份证号码的校验码是否正确。

方法思路

  • 读取输入:首先读取输入的身份证号码个数N,然后读取每个身份证号码字符串。
  • 分割和检查:将每个身份证号码分割为前17位和校验码。检查前17位是否都是数字。
  • 计算加权和:对前17位数字按指定权重求和。
  • 计算校验码:根据加权和对11取模得到Z值,然后查找对应的校验码M。
  • 校验校验码:比较计算得到的校验码和实际校验码是否一致。
  • 输出结果:记录有问题的身份证号码,输出结果。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;int main() { int a[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char M[] = {'1','0','X','9','8','7','6','5','4','3','2'}; int n; string s; vector
    errors; cin >> n; for (int i = 0; i < n; ++i) { cin >> s; if (s.length() != 18) { errors.push_back(s); continue; } string prefix = s.substr(0, 17); char check = s[17]; bool valid = true; long long sum = 0; for (int j = 0; j < 17; ++j) { if (prefix[j] < '0' || prefix[j] > '9') { valid = false; break; } int num = prefix[j] - '0'; sum += num * a[j]; } if (!valid) { errors.push_back(s); } else { int z = sum % 11; char computed_M = M[z]; if (computed_M != check) { errors.push_back(s); } } } if (errors.empty()) { cout << "All passed" << endl; } else { for (auto& error : errors) { cout << error << endl; } } return 0;}

    代码解释

  • 读取输入:使用cin读取输入的身份证号码个数N和每个身份证号码字符串。
  • 分割和检查:将每个身份证号码分割为前17位和校验码,检查前17位是否都是数字。
  • 计算加权和:遍历前17位数字,使用指定的权重数组进行加权求和。
  • 计算校验码:对加权和取模11得到Z值,查找对应的校验码M。
  • 校验校验码:比较计算得到的校验码和实际校验码,记录有问题的身份证号码。
  • 输出结果:输出所有有问题的身份证号码,如果没有问题则输出"All passed"。
  • 上一篇:PTA_L1-009 N个数求和 (20分)
    下一篇:PTA_L1-043 阅览室 (20分)

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月08日 02时19分59秒