查验身份证2
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Description
一个合法的身份证号码由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: 0 1 2 3 4 5 6 7 8 9 10
M:9 8 7 6 5 4 3 2 1 0 X
现在给定一些身份证号码,请你编写程序验证校验码的有效性。
Input
多组测试数据,每组测试数据在一行中给出1个18位身份证号码。
Output
如果身份证号码正确,输出“OK”,否则输出“Error”。
只要前17位全为数字且最后一位校验码计算准确,则号码算正确。
Sample Input
111111111111111117 111111111111111110 222222222222222225 22222222222222222X 123456789012345677 135246789159357082 012345789632145974
Sample Output
OK Error OK Error Error OK Error
题目分析:
用我的24K纯金狗眼来看……这应该是字符串!
%c 和 %d 的距离……就是48……
#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;
}