源程序如下:
#include "stdio.h"
void main()
{
int i; /*身份证的第i位*/
int s[17]; /*定义一个数组用来存放身份证的前17位*/
int t[17]; /*各位相乘后的数组*/
int m; /*余数*/
int t18; /*身份证的第18位0--9*/
char t18c; /*身份证的第18位X*/
long int sum=0;
for(i=0;i<17;i++)
{
printf("请输入身份证的第%d位:",i+1);
scanf("%d",&s[i]);
switch(i+1)
{
/*身份证的1到17位要乘的数一次是7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 */
case 1:t[i]=s[i]*7;break;
case 2:t[i]=s[i]*9;break;
case 3:t[i]=s[i]*10;break;
case 4:t[i]=s[i]*5;break;
case 5:t[i]=s[i]*8;break;
case 6:t[i]=s[i]*4;break;
case 7:t[i]=s[i]*2;break;
case 8:t[i]=s[i]*1;break;
case 9:t[i]=s[i]*6;break;
case 10:t[i]=s[i]*3;break;
case 11:t[i]=s[i]*7;break;
case 12:t[i]=s[i]*9;break;
case 13:t[i]=s[i]*10;break;
case 14:t[i]=s[i]*5;break;
case 15:t[i]=s[i]*8;break;
case 16:t[i]=s[i]*4;break;
case 17:t[i]=s[i]*2;break;
}
sum=sum+t[i];
}
printf("前17位相乘后的和为%ld\n",sum);
m=sum%17;
printf("对17取余后的值位:",m);
switch(m)
{
/*各个余数所对应第18位身份证号1 0 X 9 8 7 6 5 4 3 2*/
case 0:t18=1 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 1:t18=0 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 2:t18c='X';printf("这是一个合法的身份证号码,第18位是%c",t18c);break;
case 3:t18=9 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 4:t18=8 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 5:t18=7 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 6:t18=6 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 7:t18=5 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 8:t18=4 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 9:t18=3 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
case 10:t18=2 ;printf("这是一个合法的身份证号码,第18位是%d",t18);break;
default:printf("这不是一个合法的身份证号码");
}
printf("\n");
}
VC++6.0测试如下(输入一位后按回车输入第二位数):
#include
#include
int verifyIDCard(char input[]);
int runnian(int year);
int main()
{
int k;
char input[100];
gets(input);
k=verifyIDCard(input);
if(k==0)
printf("Invalid\n");
else
printf("Valid\n");
return 0;
}
int verifyIDCard(char string[])
{
int i,k,n=0,flag=0,month=0,days=0;
char c;
if(strlen(string)!=18) return 1;
for(i=0;i<17;i++)
{ c=string[i];
if(c<'0'||c>'9')
return 2;
}
if((string[17])!='x'&&(string[17]<'0'||string[17]>'9'))
return 3;
n=(string[6]-'0')*1000+(string[7]-'0')*100+(string[8]-'0')*10+(string[9]-'0');
days=(string[12]-'0')+(string[13]-'0');
month=(string[10]-'0')*10+(string[11]-'0');
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
k=31;
if(days>k) return 4;
}
else if(month==4||month==6||month==9||month==11)
{
k=30;
if(days>k) return 4;
}
else if(month!=2) return 4;
flag=runnian(n);
if(flag==0)
{
if((month==2)&&string[12]+string[13]>28) return 4;
}
else
{
if((month==2)&&days>29) return 4;
}
return 0;
}
int runnian(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
return 0;
}