1.判断日期的合法性
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组
// 1.判断日期合法性
//1111 22 11
bool check(int data){
int year=data/10000;
int month=data%10000/100;
int day=data%100;
//判断月份
if(month<=0||month>=13) return false;
//判断天,特判2月份
if(day==0|| month!=2&&day>months[month]) return false;
if(month==2){
//闰年,则为29天
int leap=(year%4==0&&year%100!=0)||year%400==0;
if(day>28+leap) return false;
}
return true;
}
2.得到某年某月的天数
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组
int get(int year,int month){
if(month!=2) return months[month]; //判断是否为2月
else {
int leap = (year%4==0&&year%100!=0)|| year%400==0;
return 28+leap;
}
}
3.判断两个日期之间有多少回文数(前提日期合法)
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组
bool check(int data){
int year=data/10000;
int month=data%10000/100;
int day=data%100;
//判断月份
if(month<=0||month>=13) return false;
//判断天,特判2月份
if(day==0|| month!=2&&day>months[month]) return false;
if(month==2){
//闰年,则为29天
int leap=(year%4==0&&year%100!=0)||year%400==0;
if(day>28+leap) return false;
}
return true;
}
int get(int data1,int data2,int k){
int ans=0;
for(int i=1000;i<10000;i++){
int data=i,x=i;
for(int j=0;j<4;j++)
data=data*10+x%10; //构造回文日期
if(data1<=data&&data<=data2&&check(data))//判断回文日期
ans++;
}
return ans;
}
4.给定年月日,经过n天对应的日期
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组
int get(int year,int month){
if(month!=2) return months[month]; //判断是否为2月
else {
int leap = (year%4==0&&year%100!=0)|| year%400==0;
return 28+leap;
}
}
void pass(int y,int m,int d,int n){
while(n--){
d++;
if(d>get(y,m)) m++,d=1; //当天数大于当月天数,m+1
if(m>12) y++,m=1;
}
printf("%d-%02d-%02d\n",y,m,d);
}
5.计算天数
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组
// 5.计算两个日期之间需要锻炼多久(星期一,每月第一天 2km),其他1km
//计算 2000-01-01(星期六) 到 2020-10-1(星期四) 锻炼路程
int sum(){
int ans=0;
int d=6;
int mon;
for(int year=2000;year<=2020;year++){
//遍历年份
if(year%400==0||(year%4==0&&year%100!=0))//判断是否是闰年
months[2]=29;
else
months[2]=28;
if(year==2020) mon=9;//判断是否是2020年
else mon=12;
for(int m=1;m<=mon;m++){
//遍历月份
for(int j=1;j<=months[m];j++){
//遍历天数
if(j==1||d==1){
ans++;
}
d++;
ans++;
d=d%7;
}
}
}
return ans+2;//加上2020-10-01
}
例题
1.回文日期(检查日期的合法性)
链接:回文日期
#include<bits/stdc++.h>
using namespace std;
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int data){
int year=data/10000;
int month=data%10000/100;
int day=data%100;
//判断月份
if(month<=0||month>=13) return false;
//判断天,特判2月份
if(day==0|| month!=2&&day>months[month]) return false;
if(month==2){
//闰年,则为29天
int leap=(year%4==0&&year%100!=0)||year%400==0;
if(day>28+leap) return false;
}
return true;
}
int ans;
int main(){
int data1,data2;
cin>>data1>>data2;
for(int i=1000;i<10000;i++){
int data=i,x=i;
for(int j=0;j<4;j++)
data=data*10+x%10,x=x/10;//构造回文日期
if(data>=data1&&data<=data2&&check(data)) ans++;
}
cout<<ans<<endl;
return 0;
}
2.日期问题(检查日期合法性)
链接:日期问题
#include<bits/stdc++.h>
using namespace std;
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int year ,int month,int day){
//判断日期是否合法
if(month<=0||month>=13) return false;
if(day==0||(month!=2&&day>months[month])) return false;
if(month==2){
int leap=(year%400==0)||(year%4==0&&year%100!=0);
if(day>leap+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 year=i/10000,month=i%10000/100,day=i%100;
if(check(year,month,day)){
//判断是否满足条件
if(year%100==a&&month%100==b&&day%100==c||
month%100==a&&day%100==b&&year%100==c||
day%100==a&&month%100==b&&year%100==c
)
printf("%d-%02d-%02d\n",year,month,day);
}
}
return 0;
}
3.回文日期(检查合法性+判断回文)
链接:回文日期
#include<bits/stdc++.h>
using namespace std;
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check_vaild(int data){
//检查合法性
int year=data/10000,month=data%10000/100,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%400==0) ||(year%4==0&&year%100!=0);
if(day>28+leap) return false;
}
return true;
}
bool p1,p2;
int ans1,ans2;//记录两个日期
bool check_huiwen(int data){
//判断回文
int year=data/10000;
int month=data%10000/100;
int day=data%100;
if(month%10==day/10) return false;
if(month/10==day/10&&month%10==day%10) return true;
return false;
}
int main(){
int data;
cin>>data;
int year=data/10000;
while(1){
int new_data=year,x=year;
for(int i=0;i<4;i++) //构造回文日期
new_data=new_data*10+x%10,x=x/10;
if(new_data==data){
year++;
continue;
}
if(check_vaild(new_data)){
//检查合法性
if(!p1) p1=true,ans1=new_data;
if(!p2&&check_huiwen(new_data)) p2=true,ans2=new_data;
}
year++;
if(p1&&p2) break; //找到两个日期,则退出while
}
cout<<ans1<<endl<<ans2<<endl;
}
4.日期计算(计算是多少天+判断每月的天数)
链接:日期计算
#include<bits/stdc++.h>
using namespace std;
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
//判断每月为几天
int get(int year,int month){
if(month!=2) return months[month];
else {
int leap=(year%400==0)||(year%4==0&&year%100!=0);
return leap+28;
}
}
//计算某年的第n天
void pass(int y,int m,int d,int n){
while(n--){
d++;
if(d>get(y,m)) m++,d=1;
if(m>12) y++,m=1;
}
printf("%d\n%d\n",m,d);
}
int main(){
int y,n;
cin>>y>>n;
int m=1,d=0;
pass(y,1,d,n);
return 0;
}
5.跑步锻炼(计算天数)
#include<bits/stdc++.h>
using namespace std;
int months[]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
int sum(){
int ans=0;
int d=6;
int mon;
for(int year=2000;year<=2020;year++){
//遍历年份
if(year%400==0||(year%4==0&&year%100!=0))//判断是否是闰年
months[2]=29;
else
months[2]=28;
if(year==2020) mon=9;//判断是否是2020年
else mon=12;
for(int m=1;m<=mon;m++){
//遍历月份
for(int j=1;j<=months[m];j++){
//遍历天数
if(j==1||d==1){
ans++;
}
d++;
ans++;
d=d%7;
}
}
}
return ans+2;//加上2020-10-01
}
int main(){
cout<<sum()<<endl;
return 0;
}
转载:https://blog.csdn.net/m0_46549425/article/details/115445821
查看评论