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;
}