栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

PAT初级1031(C++)查验身份证

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PAT初级1031(C++)查验身份证

PAT初级1031(C++)查验身份证 题目:

思路:

1.检测前17位中是否全为数字,最好单个单个字符检测,利用ASCII码值是否在48-57(0-9)之间判断是否为数字,其余的便为字符(因为所给的号码不确定会有什么字母/数字)
2.同时让获取的判断为数字的各个字符乘以相应的权重,mod11后得到z
3.转换z对应的M值与获取的最后一个字符进行校验
4.可设置一个信号量判断是否全部正常

代码:
# include
# include
using namespace std;

int getz(string num)
{
    const int W[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    int n=0;
    
    for (int j = 0; j< 17;j++)
    {
        int tmp = (int)num[j];
        if (tmp >= 48 && tmp <= 57)
        {
             n += W[j]*(tmp-48);
            continue;
        }
        else
        {
            return 11;
        }
    }
    
    return n%11;
}

int main()
{
    const string M[11] = {"1","0","X","9","8","7","6","5","4","3","2"};
    
    int N,k=0;
    cin>>N;
    string number="";
    bool flag = false;
    int z=-1;
    int getz(string num);
    
   while(k
       cin>>number;
       z = getz(number);
       if(z>=0&&M[z]!=number.substr(number.size()-1,number.size())||z==11)
          {
              flag = true;
              cout<>number;
       z = getz(number);
       if(z>=0&&M[z]!=number.substr(number.size()-1,number.size()))
          {
              flag = true;
              cout<
        cout<<"All passed";
    }
    
    return 0;
}
结果:

Plus:

注意:
不要直接用stoi(“xxx”)函数,否则遇到字母会报错,以及遇到“0xx”的转换可能会出问题

其它解法(搬运):
https://blog.csdn.net/WWIandMC/article/details/106851349

https://blog.csdn.net/masteren/article/details/90245894

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949837.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号