输入样例1:
为保密,样例中的身份证号前6位统一设为239999。
239999200003132617于龙
输出样例1:
NO
输入样例2:
239999200002210832杨冰
输出样例2:
NO
输入样例3:
239999200201131429张玮娜
输出样例3:
NO
输入样例3:
239999200201210017刘哲
输出样例3:
YES
题目说不能用if和switch。我觉得没必要用long long int去保存数据,如果身份证再长一点怎么办。建议用数组保存,挑出其中需用要的年月日就好了。可以参考我的代码。
//不能用if和switch。我这个应该可以你试试。
#include <stdio.h>
int main()
{
while (1)
{
char arr[32];
scanf("%s", &arr);
int year = (int)(arr[6] - '0') * 1000 + (int)(arr[7] - '0') * 100 + (int)(arr[8] - '0') * 10 + (int)(arr[9] - '0');
int month = (int)(arr[10] - '0') * 10 + (int)(arr[11] - '0');
int day = (int)(arr[12] - '0') * 10 + (int)(arr[13] - '0');
((year == 2001 && (month > 1 || (month == 1 && day > 24))) || (year == 2002 && (month < 2 || (month == 2 && day < 11))))
? printf("YES\n")
: printf("NO\n");
}
return 0;
}
出错应该是因为判断最后一位的身份证否是'x'那里出错了,应该吧i='x'改为i=='x', 如果是赋值,则这个if条件会一直满足,则所有身份证号的数据提取都会在这个if进行,而导致结果错误。
修改如下:
#include <stdio.h>
int main(void){
long long a,b,c,d,e,f;
char i;
scanf("%lld%c",&a,&i);
// printf("身份证号是:%lld, 身份证最后一位是:%c\n",a,i);
c = a/100000000%10000;
d=a/10000%10000;
b=a/10%2;
//printf("c=%lld,d=%lld,b=%lld\n",c,d,b);
if(i=='x'){
c=a/10000000%10000;
d=a/1000%10000;
b=a%2;
//printf("if i=='x' , c=%lld,d=%lld,b=%lld\n",c,d,b);
}
switch(c){
case 2001:
if (d>=124){
if(b==0){
printf("NO");
}else if(b!=0){
printf("YES");
}
}
break;
case 2002:
if(d<=211){
if(b==0){
printf("NO");
}else if(b!=0){
printf("YES");
}else if(b>211){
printf("NO");
}
}
break;
default:
printf("NO");
}
return 0;
}
不允许使用if和switch
主要是结尾的X容易忽略
#include<stdio.h>
int main()
{
long long a,b;
char abc [10];
scanf("%lld%s",&a,abc);
if(abc[0]=='X'){
b=(a/1000)%100000000;
if(a%2==0){
printf("NO");
}
else{
if(b>=20010124&&b<=20020211){
printf("YES");
}
else{
printf("NO");
}
}
}
else{
b=(a/10000)%100000000;
if((a/10)%2==0){
printf("NO");
}
else{
if(b>=20010124&&b<=20020211){
printf("YES");
}
else{
printf("NO");
}
}
}
return 0;
}