日期-基础循环遍历模板
计算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;
}