查验身份证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;
}