1.判断一个日期是否为有效日期。
给定日期格式如:20200202。
有效日期输出1,否则输出0。
#include<iostream>
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(int data)//data(20200202)
{
int year=data/10000;
int month=data%10000/100;
int day=data%100;
if(month<=0||month>=13) return false;
if(day==0||month!=2&&day>months[month]) return false;
if(month==2)
{
int leap=(year%4==0&&year%100!=0)||(year%400==0);
if(day>28+leap) return false;
}
return true;
}
int main()
{
int time;
cin>>time;
int t=judge(time);
cout<<t;
}
2.统计给定两个日期之间的天数(包含边界)
给定日期格式如:20200202。
#include<iostream>
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(int time)
{
int y=time/10000;
int m=time%10000/100;
int d=time%100;
int leap=(y%4==0&&y%100!=0)||(y%400==0);
if(m==0||m>13||d==0) return false;
if(m!=2&&d>months[m]) return false;
if(m==2&&d>28+leap) return false;
return true;
}
int main()
{
int time1,time2;
int sum=0;
cin>>time1>>time2;
for(int i=time1;i<=time2;i++)
{
if(judge(i))
sum++;
}
cout<<sum;
}
3.计算某年第某天(不会超过365)的月和日的值。
比如:计算2020年第50天的月和日。
#include<iostream>
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(int time)
{
int y=time/10000;
int m=time%10000/100;
int d=time%100;
int leap=(y%4==0&&y%100!=0)||(y%400==0);
if(m==0||m>13||d==0) return false;
if(m!=2&&d>months[m]) return false;
if(m==2&&d>28+leap) return false;
return true;
}
int main()
{
int y, n;
cin>>y>>n;
int k=y*10000;
while(n!=0)
{
if(judge(k)) k+=1,n--;
else k+=1;
}
k-=1;
int m=k%10000/100,d=k%100;
cout<<m<<endl;
cout<<d<<endl;
}
4.计算某年某月的天数。
给定日期格式如:202002。
#include<iostream>
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int num_month(int data)//202002
{
int res;
int year=data/100;
int month=data%100;
int leap=(year%4==0&&year%100!=0)||(year%400==0);
if(month==2)
res=28+leap;
else res=months[month];
return res;
}
int main()
{
int data;
int t=100;
while(t--)
{
cin>>data;
cout<<num_month(data);
cout<<endl;
}
}
5.统计两日期之间的回文日期个数。
给定日期格式如:20200202。
#include<iostream>
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge(int time)
{
int y=time/10000;
int m=time%10000/100;
int d=time%100;
int leap=(y%4==0&&y%100!=0)||(y%400==0);
if(m==0||m>13||d==0) return false;
if(m!=2&&d>months[m]) return false;
if(m==2&&d>28+leap) return false;
return true;
}
int main()
{
int time1,time2;
cin>>time1>>time2;
int res=0;
for(int i=1000;i<10000;i++)//构造回文日期
{
int x=i,r=i;
for(int j=0;j<4;j++)
{
r=r*10+x%10;
x/=10;
}
if(r>=time1&&r<=time2&&judge(r))
res++;
}
cout<<res;
}
6.给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入样例:
20200202
输出样例:
20211202
21211212
#include<iostream>
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool judge1(int time)//判断日期是否有效
{
int y=time/10000;
int m=time%10000/100;
int d=time%100;
int leap=(y%4==0&&y%100!=0)||(y%400==0);
if(m==0||m>13||d==0) return false;
if(m!=2&&d>months[m]) return false;
if(m==2&&d>28+leap) return false;
return true;
}
bool judge2(int time2)//判断是否为ABAB
{
int a=time2/10000000,b=time2/1000000%10,c=time2/100000%10,d=time2/10000%10;
if(a==c&&b==d&&a!=b) return true;
else return false;
}
int main()
{
int time;
cin>>time;
bool flag=false;
for(int i=1000;i<10000;i++)
{
int x=i,r=i;
for(int j=0;j<4;j++)
{
r=r*10+x%10;
x/=10;
}
if(judge1(r)&&r>time&&flag==false)
{
cout<<r<<endl;
flag=true;
}
if(judge1(r)&&judge2(r)&&r>time)
{
cout<<r<<endl;
break;
}
}
}
未完待续!!!