下午做了两道日期问题,题目及代码如下
(103 日期问题)
#include<bits/stdc++.h>
using namespace std;
const int N=13;
int days[N]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int y,int m,int d){
if(m==0||m>12||d==0) return false;
if(m!=2&&d>days[m]) return false;
if(m==2)
{
if(y%400==0||(y%4==0&&y%100!=0)) //判断是否是闰年
{
if(d>29)return false;
}else{
if(d>28)return false;
}
}
return true;
}
int main()
{
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c); //格式化输入
for(int i=19600101;i<=20591231;i++)
{
int y=i/10000,m=i%10000/100,d=i%100;
if(check(y,m,d))
{
if((a==y%100&&b==m&&c==d)||(c==y%100&&a==m&&b==d)||(c==y%100&&b==m&&a==d))
printf("%d-%02d-%02d\n",y,m,d); //格式化输出
}
}
return 0;
}
(498 回文日期)
#include<bits/stdc++.h>
using namespace std;
const int N=13;
int days[N]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check1(int n){ //判断日期是否合法
int y=n/10000;
int m=n%10000/100;
int d=n%100;
if(m==0||m>12||d==0) return false;
if(m!=2&&d>days[m]) return false;
if(m==2)
{
if((y%4==0&&y%100!=0)||y%400==0)
{
if(d>29)return false;
}else{
if(d>28)return false;
}
}
return true;
}
bool check2(string s){ //判断是否是回文数
for(int i=0,j=s.size()-1;i<j;i++,j--)
{
if(s[i]!=s[j])return false;
}
return true;
}
bool check3(string s){ //判断是否是ABABBABA型的回文数
if(check2(s))
{
if(s[0]==s[2]&&s[1]==s[3]&&s[0]!=s[1])
{
return true;
}else return false;
}return false;
}
int main()
{
int n;cin>>n;
bool flag=false;
for(int i=n+1;;i++)
{
if(check1(i))
{
string str=to_string(i);
if(!flag&&check2(str)) //确保只输出第一个回文型数
{
cout<<str<<endl;
flag=true;
}
if(check3(str))
{
cout<<str<<endl;
break;
}
}
}
return 0;
}
面对日期问题,最好的方法就是暴力枚举,逐个验证,但是要注意好挖下的坑,第二道中所给数字的下一个回文数字就有可能是ABABBABA类型,所以就输出同一个,要在check1(判断完日期是否合法)后同时进行check2(判断日期是否是回文数)和check3(判断日期是否是ABABBABA型回文数)。我bool了一个变量flag(控制好回文数字只输出一个)
通过这道题来学习一下to_string()函数的用法,可以将整型转换为字符串类型
int num=12345;
string str=to_string(num);
cout<<str<<endl;