时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++32768k,其他语言65536k
64bit IO Format:%lld
题目描述 某国的身份证号由十位数组成 YYMMDDCCCC
其中YY表示出生年份的后两个数,MM表示出生月份(男生的MM取值是[1,12],而女生的MM是月份加上50的结果,也就是[51,62]),DD表示出生日,CCCC的取值要保证身份号可以被11整除,现在Tabris手上有一批身份证号,他想找你帮他判断哪一些是合理的,哪一些不合理,你能用程序帮他解决吗?
输入描述:
第一行输入一个整数n,表示一共测试身份证号的个数。
接下来是n行需要测试的身份证号码
(0=<n<=100000)
输出描述:
每组输出一行,该身份证号是否合理,合理输出YES,不合理输出NO
示例:
输入
3
1536220000
0402299391
2002296384
输出
NO
NO
NO
说明:1536220000(36月份不存在),0402299391(不能被11整除),2002296384(不是闰年不存在29天)
非闰年12个月的天数:{31,28,31,30,31,30,31,31,30,31,30,31}
闰年二月有29天
分析:分别对闰年与非闰年进行分开讨论,判断数字是否合理,不合理则flag标记0;被11整除的数的特征:奇数位上的数与偶数位上的数的差可以被11整除
C语言代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,len;
int t[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//不是闰年是的12个月
scanf("%d",&n);
for(j=0;j<n;j++)
{
char b[15]={0};
int a[15]={0};
int flag=1,tian;
scanf("%s",b);
len=strlen(b);
if(len!=10)
flag=0;//输入不满十位
for(i=0;i<10;i++)
a[i]=b[i]-'0';
if((a[0]*10+a[1])>=0&&(a[0]*10+a[1])<=6)
tian=2000+a[0]*10+a[1];//计算年份
else
tian=1999+a[0]*10+a[1];
if(tian%400==0)//是闰年
{
t[2]=29;
if((a[2]*10+a[3])>=1&&(a[2]*10+a[3])<=12)//是男性
{
if((a[4]*10+a[5])>=t[a[2]*10+a[3]])//判断月份是否合理
flag=0;
}
else if((a[2]*10+a[3])>=51&&(a[2]*10+a[3])<=62)//是女性
{
if((a[4]*10+a[5])>=t[a[2]*10+a[3]+50])//判断月份是否合理
flag=0;
}
else
flag=0;
if(((a[0]+a[2]+a[4]+a[6]+a[8])-(a[1]+a[3]+a[5]+a[7]+a[9]))%11!=0)//判断是否能被11整除
flag=0;
}
else//不是闰年
{
t[2]=28;
if((a[2]*10+a[3])>=1&&(a[2]*10+a[3])<=12)//是男性
{
if((a[4]*10+a[5])>=t[a[2]*10+a[3]])//判断月份是否合理
{
flag=0;
}
}
else if((a[2]*10+a[3])>=51&&(a[2]*10+a[3])<=62)//是女性
{
if((a[4]*10+a[5])>=t[a[2]*10+a[3]+50])//判断月份是否合理
flag=0;
}
else
{
flag=0;
}
if(((a[0]+a[2]+a[4]+a[6]+a[8])-(a[1]+a[3]+a[5]+a[7]+a[9]))%11!=0)//判断是否能被11整除
{
flag=0;
}
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}