算法002-日期-基础遍历模板、判断第几天、纪念日(分钟)、星期计算(星期)、时间显示(秒)、回文日期(遍历判断日期合法性+转化成字符串判断格式)

日期-基础循环遍历模板

计算1000天后是几号 

#include<bits/stdc++.h>
using namespace std;

int m1[]={0,1,3,5,7,8,10,12};//大月 
int m2[]={0,4,6,9,11};//小月 

int main(){
	int year =2025,month=3,day=2;
	for(int i=1;i<=1000;i++){//计算1000天是几号 
		day++;
		for(int j=1;j<=7;j++){//判断是否是大月 
			if(month==m1[j] && day==32){
				month++;
				day=1;
				break;
			}
		} 
		for(int j=1;j<=4;j++){//判断是否是小月 
			if(month==m2[j] && day==31){
				month++;
				day=1;
				break;
			}
		}
		if(month==2){
			if(year%4==0 && year%100 != 0 || year%400==0){//判断是否为闰年 
				if(day==30){
					month++;
					day=1;
				}
			}else{
				if(day==29){
					month++;
					day=1;
				}
			}
		}
		if(month==13){
			month=1;
			year++;
		}
	} 
	cout << year << "-" << month << "-" <<day;
} 

第几天

【问题描述】
2000 年的 1 月 1 日,是那一年的第 1 天。那么,2000 年的 5 月 4 日,是那一年的第几天?

#include<bits/stdc++.h>
using namespace std;

int m1[]={0,1,3,5,7,8,10,12};
int m2[]={0,4,6,9,11};
int main(){
	int year=2000, month=1, day=1;
	int num=0;
	while(1){
		num++;
		day++;
		for(int j=1;j<=7;j++){
			if(month==m1[j] && day==32)
			{
				month++;
				day=1;
				break;
			}
		}
		for(int j=1;j<=4;j++){
			if(month==m2[j] && day==31)
			{
				month++;
				day=1;
				break;
			}
		}
		if(month==2){
			if((year%4==0&&year%100!=0)||year%400==0){
				if(day==30){
					month++;
					day=1;
				}
			}
			else{
				if(day==29){
					month++;
					day=1;
				}
			}
		}
		if(month==13){
			month++;
			year++;
		}
		if(year==2000 && month==5 && day==4)
		//使用2000-1-2测试是得出结果1,因此运行处结果后+1即为答案 
		    break;
	}
	cout << num << endl;//运行结果为124,五月四号是第125天 
} 

纪念日

【问题描述】
2020 年 7 月 1 日是 ××××× 成立 99 周年纪念日。
××××× 成立于 1921 年 7 月 23 日。
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?

#include<bits/stdc++.h>
using namespace std;
int m1[] = {0,1,3,5,7,8,10,12};
int m2[] = {1,4,6,9,11};

int main(){
	int year=1921,month=7,day=23;
	int year2=2020,month2=7,day2=1;
	int num=0;
	while(1){
		num++; //记录经过的天数 
		day++;
		for(int i=1;i<=7;i++){
			if(month==m1[i] && day==32){
				month++;
				day=1;
				break;
			}
		}
		for(int i=1;i<=4;i++){
			if(month==m2[i] && day==31){
				month++;
				day=1;
				break;
			}
		}
		if(month==2){
			if((year%4==0&&year%100!=0)||year%400==0){
				if(day==30){
					month++;
					day=1;
				}
			}else{
				if(day==29){
					month++;
					day=1;
				}
			}
		}
		if(month==13){
			month=1;
			year++; 
		}
		if(year==year2 && month ==month2 && day==day2)
		    break;
	}
	int min=num*24*60;
	cout << num <<" " << min << endl;
}

星期计算

【问题描述】
已知今天是星期六,请问 20^22 天后是星期几?
注意用数字 1 到 7 表示星期一到星期日。

#include<bits/stdc++.h>
using namespace std;

int main(){
	int curday=6;//现在是星期几 
	int day=1;
	for(int i=1;i<=2;i++){
		day = 20*(day%7) % 7; //边乘边取余 
	}
	int w=(day+curday-1)%7+1;
	cout << w;
} 

时间显示

【问题描述】
小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00 : 00 : 00 到当前时刻经过的毫秒数。现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
【输入格式】
输入一行包含一个整数,表示时间。

【输出格式】
输出时分秒表示的当前时间,格式形如 HH : MM : SS,其中 HH 表示时,
值为 0 到 23,MM 表示分,值为 0 到 59,SS 表示秒,值为 0 到 59。时、分、秒
不足两位时补前导 0。
【样例】
输入数据 1: 46800999
输出数据 1: 13 : 00 : 00
输入数据 2: 1618708103123
输出数据 2: 01 : 08 : 23
【数据范围】
对于所有评测用例,给定的时间为不超过 10^18 的正整数。

#include<bits/stdc++.h>
using namespace std;
 
int main(){
	long long num;
	cin>>num;
	num = num/1000%(24*60*60); //计算最后一天的秒数 
	int h=num/(60*60);//计算小时数 
	num=num%(60*60);
	int m=num/60; 
	int s=num%60;
	printf("%02d:%02d:%02d",h,m,s); 
	return 0;
} 

回文日期

【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2日。因为如果将这个日期按“yyyymmdd”的格式写成一个 8 位数,是 20200202,恰好是一个回文数。我们称这样的日期为回文日期。
有人表示 20200202 是“千年一遇”的特殊日子。对此小明很不认同,因为不到 2 年后就是下一个回文日期:2021 年 12 月 2 日。
也有人表示 20200202 不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA型的回文日期:2121 年 12 月 12 日。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA 型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数 N,表示日期。
【输出格式】
输出两行,每行 1 个八位数。 第一行表示下一个回文日期,第二行表示
下一个 ABABBABA 型的回文日期。
【样例】
输入数据 1: 20200202
输出数据 1: 20211202 21211212
【数据范围】
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的
8 位数表示。

#include<bits/stdc++.h>
using namespace std;

int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int data){
	int year = data/10000;//从data中分离出年 
	int month = (data%10000)/100;//从data中分离出月 
	int day = data%100;//从data中分离出日 
	if(!day || month<=0 || month>12) return false;//判断日期月份是否合法 
	if(month==2){
		if((year%4==0 && year%100==0) || year%400==0){//判断是否为闰年 
			if(day>=30) return false;
		}
		else {
			if(day>=29) return false;
		}
	} 
	return true;
}
bool check1(string s){ //判断是否为回文数 
	int len=s.size();
	for(int i=0,j=len-1;i<j;i++,j--){//两个变量做两个指针,一个从前往后,一个从后往前 
		if(s[i]!=s[j]) return false;
	}
	return true;
}
bool check2(string s){
	if(check1(s)){//判断是否为回文数 
		if(s[0]!=s[2] || s[1]!=s[3] || s[1]==s[1]) return false;//判断是否为ABABBABA的格式 
		return true;
	}
	return false;
}
int main(){
	int flag=0;
	cin >> data;
	for(int i=data+1;;i++){
		if(check(i)){//判断是否为合法日期 
			string s=to_string(i);
			if(check(s) && !flag){//flag避免重复输出 
				cout << i << endl;
				flag=1;
			} 
			if(check2(s)){
				cout<<i<<endl;
				return 0;
			}
		}
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值