查验身份证
一个合法的身份证号码由17位数字(包含地区、出生日期和顺序编号)加1位校验码组成。
校验码的计算规则如下:
(1)首先对前17位数字加权求和,权重分配为: (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4,3,)
(2)然后将计算的和对11取模得到值Z;
(3)最后按照以下关系对应Z值与校验码M的值
Z: 012345678910
M: 9876543210X
现在给定一些身份证号码,请你编写程序验证校验码的有效性。
输入
多组测试数据,每组测试数据在一行中给出1个18位身份证号码。
输出
如果身份证号码正确,输出"OK",否则输出"Error
只要前17位全为数字且最后一位校验码计算准确,则号码算正确。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int f,z;
char s[20];
int m[11] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 10 };
int q[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 3};
int sum = 0;
while(gets(s)!=NULL)
{
sum = 0;
f = 0;
for(i=0;i<17;i++)
{
s[i] -= 48;
sum += s[i]*q[i];
}
z = sum%11;
for(i=0;i<=10;i++)
{
if(z==i)
{
z=m[i];
break;
}
}
if(s[17]-48==z)
f=1;
if(s[17]=='X' && z==10)
f=1;
if(f==1)
printf("OK\n");
else
printf("Error\n");
}
return 0;
}