用C语言编写一个程序,验证输入的身份证是否合法
3个回答
2013-05-13
展开全部
源程序如下:
#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 "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<stdio.h>
#include<string.h>
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;
}
#include<string.h>
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int checkIdNo(char *idno){
int jq[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char end[11]="10X98765432";
int i,sum=0;
for(i=0; i<17; i++){
if(idno[i]>'0' || idno[i]<'9')
sum += (idno[i]-48)*jq[i];
else
return -1;
}
sum = sum%11;
if(end[sum]==idno[17])
return 0;
return -1;
}
int jq[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char end[11]="10X98765432";
int i,sum=0;
for(i=0; i<17; i++){
if(idno[i]>'0' || idno[i]<'9')
sum += (idno[i]-48)*jq[i];
else
return -1;
}
sum = sum%11;
if(end[sum]==idno[17])
return 0;
return -1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询