暑假计算机学习第四天(7.17)

下午做了两道日期问题,题目及代码如下

(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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝学会编程的代码小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值