高级光能
合法日期经验值:0
题目描述 Description
身份证造假是违法行为。有些粗心的诈骗犯在造假身份证的时候连日期都写不对。现在请你编写一个程序,输入一个身份证号,请你判断身份证号中的日期是否合法。
身份证号是一个字符串长度为18位,其中第7~14位为出生日期(如1998年9月30日为19980930,最后一位可能是X,其他位均是数字。
请你判断身份证上的日期是否合法(日期真实存在),如果合法,输出YES,否则,输出NO。
输入描述 Input Description
一个字符串,代表身份证号
输出描述 Output Description
如题所述
样例输入 Sample Input
211381197613088853
样例输出 Sample Output
NO
数据范围及提示 Data Size & Hint
字符串的长度为18位。
样例中日期是19761308,月份不可能有13月,所以不合法。
平年1~12月的天数分别为31,28,31,30,31,30,31,31,30,31,30,31,闰年2月份天数29天。
所有年份(0000~9999)都认为是合法的。
年份是4的倍数但不是100的倍数,或者年份是400的倍数,即为闰年。
我的RE50
#include<iostream>
#include<cstdio>
using namespace std;
string s;
int days[13]={31,28,31,30,31,30,31,31,30,31,30,31};
int f(string t){
int sum;
int a;
for(int i=0;i<=t.length()-1;i++){
a=t[i]-'0';
sum=sum*10+a;
}
return sum;
}
string check(int x,int y,int z){
bool flag=0;
if(!(x>=0&&x<=9999))flag=1;
if(!(y<=12))flag=1;
if(!(z>=0&&z<=days[y]))flag=1;
if(flag)return "NO";
return "YES";
}
int main() {
getline(cin,s);
string a=s.substr(7,4);
string b=s.substr(11,2);
string c=s.substr(13,2);
int x=f(a);
int y=f(b);
int z=f(c);
if(y==2)if(x%4==0&&x%100!=0||x%400==0)days[2]++;
cout<<check(x,y,z);
return 0;
}
王旭杰在2022-10-07 21:00:22追加了内容
60
#include<iostream>
#include<cstdio>
using namespace std;
string s;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int f(string t){
int sum;
int a;
for(int i=0;i<=t.length()-1;i++){
a=t[i]-'0';
sum=sum*10+a;
}
return sum;
}
string check(int x,int y,int z){
bool flag=0;
if(!(x>=0&&x<=9999))flag=1;
if(!(y<=12&&y>=0))flag=1;
if(!(z>=0&&z<=days[y]))flag=1;
if(flag)return "NO";
return "YES";
}
int main() {
getline(cin,s);
string a=s.substr(7,4);
string b=s.substr(11,2);
string c=s.substr(13,2);
int x=f(a);
int y=f(b);
int z=f(c);
if(y==2)if(x%4==0&&x%100!=0||x%400==0)days[2]++;
cout<<check(x,y,z);
return 0;
}