1277.严厉打击假冒身份证 SDNUOJ 1277

Description
WY最近从网上学来了如何验证正确的身份证的方法,有了这个方法,WY天黑都不怕~~

已知身份证验证方法如下:
根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
1.将前面的身份证号码17位数分别乘以不同的系数。身份证号码第i位对应的系数为[2^(18-i)] mod 11(此处^代表指数运算)。
2.将这17位数字和系数相乘的结果相加
3.用加出来和除以11,得出余数y。
4.校验码为(12 - y) mod 11 若此结果为10,则以小写字母x代替。
Input
多行身份证号
Output
输出该身份证是否合法,合法输出"Right",不合法输出"Error",后边跟一空白行
Sample Input
111111199801010017
Sample Output
Right

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

int ksm(int n)///快速幂
{
    int a = 2;
    int ans = 1;
    while(n)
    {
        if(n & 1)
            ans = ans * a % 11;
        n >>= 1;
        a = (a * a) % 11;
    }
    return ans;
}

void slove(string a)
{
    long long sum = 0;
    for(int i = 0; i < 17; ++i)
        sum += (a[i] - '0') * ksm(17 - i);
    int y = sum % 11;
    int ma = (12 - y) % 11;
    if(ma == 10)
    {
        if(a[17] == 'x' )
            cout << "Right" << '\n' << '\n' ;
        else
            cout << "Error" << '\n' << '\n' ;
    }
    else
    {
        if(ma == (a[17] - '0' ) )
            cout << "Right" << '\n' << '\n' ;
        else
            cout << "Error" << '\n' << '\n' ;
    }
    return ;
}

int main()
{
    string s;
    while(cin >> s)
        slove(s);
    return 0;
}

全部评论

相关推荐

小红书 后端开发 总包n+8w+期权
点赞 评论 收藏
分享
Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务