zoukankan      html  css  js  c++  java
  • L1-016. 查验身份证

    题目:

    一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

    首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

    Z:0 1 2 3 4 5 6 7 8 9 10
    M:1 0 X 9 8 7 6 5 4 3 2
    

    现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

    输入格式:

    输入第一行给出正整数N(100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

    输出格式:

    按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed

    输入样例1:

    4

    320124198808240056

    12010X198901011234

    110108196711301866

    37070419881216001X

    输出样例1:

    12010X198901011234

    110108196711301866

    37070419881216001X

    输入样例2:

    2

    320124198808240056

    110108196711301862

    输出样例2:

    All passed

    上代码:

      吃了昨天那个亏(毕竟用Java怎么也不能全部AC还拿不到全分太难受了呀),今天速成了一下C++后开始接着刷题,前面几道简单题都很简单,用C++都一遍通过了,所以就不做记录了。这道题其实也没什么好说的,而且我这个代码虽然全部通过了,但也不是最优的。还是附上柳婼大大的答案吧,不过我觉得她这个答案里面可以直接把b[11]给设为字符数组啊,不然还要把X给换成10  (⊙▽⊙)

    https://blog.csdn.net/liuchuo/article/details/51988823?utm_source=blogxgwz3

    #include <cctype>
    #include <iostream>
    using namespace std;
    bool check(char c[])
    {
        int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        int sum=0;
        for(int i=0;i<17;i++)
        {
            sum+=a[i]*(c[i]-'0');
        }
        int index=sum%11;
        char b[11]={'1','0','X','9','8','7','6','5','4','3','2'};
        return b[index]==c[17];
    }
    int main()
    {
        int n,flag=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            int a=0;
            char c[18];    
            cin>>c;
            //bool b=check(c);
            for(int j;j<17;j++)
            {
                if(isalpha(c[j]))
                {
                    cout<<c<<endl;
                    a=1;flag=1;
                    break;
                }
            }
            if(a==0)
            {
                if(!check(c))
                {
                    cout<<c<<endl;
                    flag=1;
                }
            }
            
        }
        if (flag == 0) cout << "All passed";
        return 0;
    }

    我其实是为了用cctype里面的isalpha()函数来判断是否有字母(最开始觉得这样方便)才硬用字符数组接收的身份证号。其实用string s接收的话可以这么做:if(s[i]<'0' || s[i]>'9')

    (全部AC的感觉最爽了。。。)

  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/littleLittleTiger/p/10358140.html
Copyright © 2011-2022 走看看