首页 > 其他 > 详细

日期模拟

时间:2020-10-25 18:55:24      阅读:68      评论:0      收藏:0      [点我收藏+]

1.跑步锻炼

题目:

小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了 激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。 小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

代码:

#include<bits/stdc++.h>
using namespace std;
int a[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
	int y = 2000, m = 1, d = 1, s = 6;
	int cnt = 0;
	while(1)
	{
		if(y == 2020 && m == 10 && d == 2) break;
		if(d == 1 || s == 1) cnt ++;
		if( (y % 4 == 0 && y % 100 != 0) || y % 400 == 0) a[2] = 29; //判断闰年 
		else a[2] = 28;
		if(a[m] != d) //判断是否是此月的最后一天 
		{
			cnt ++;
			d ++;
		}
		else
		{
			cnt ++;
			d = 1;
			m ++;
		}
		if(m == 13) //判断是否已经是此年的最后一天 
		{
			m = 1;
			y ++;
		}
		if(s != 7) s ++; //判断是否此天为星期日 
		else s = 1;
	}
	cout << cnt;
	return 0;
}

2.回文日期

题目:

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202, 恰好是一个回文数。我们称这样的日期是回文日期。 有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为 不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。 也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千 年一遇”,顶多算 “千年两遇”。 给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

【输入格式】

输入包含一个八位整数 N,表示日期。

【输出格式】

输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下 一个 ABABBABA 型的回文日期。

【样例输入】

20200202

【样例输出】

20211202

21211212

【评测用例规模与约定】

对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的 8 位数表示。

题解:此题回文串就两种类型,进行日期模拟,然后进行匹配暴力匹配即可。
ps:sprintf的作用是将一个格式化的字符串输出到一个目的字符串中。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char ans1[10], ans2[10]; 
int flag1 = 0, flag2 = 0;
void check1(int y, int m, int d)
{
	sprintf(ans1, "%04d%02d%02d", y, m, d);
	if(ans1[0] == ans1[7] && ans1[1] == ans1[6] && ans1[2] == ans1[5] && ans1[3] == ans1[4])
		flag1 = 1;
}

void check2(int y, int m, int d)
{
	sprintf(ans2, "%04d%02d%02d", y, m, d);
	char temp1 = ans2[0];
	char temp2 = ans2[1];
	if(ans2[2] == temp1 && ans2[3] == temp2 && ans2[4] == temp2 && ans2[5] == temp1 && ans2[6] == temp2 && ans2[7] == temp1)
		flag2 = 1;
}


void solve(int y, int m, int d)
{
	while(1)
	{
		if( (y % 4 == 0 && y % 100 != 0) || y % 400 == 0) a[2] = 29;
		else a[2] = 28;
		if(d != a[m]) d++;
		else
		{
			d = 1;
			m ++;
		}
		if(m == 13)
		{
			m = 1;
			y++;
		}
		if(!flag1) check1(y, m, d); //判断回文数 
		if(!flag2) check2(y, m, d); //判断ABABBABA数  
		if(flag1 && flag2) break;
	}
}

int main()
{
	ios::sync_with_stdio(false);
	string s;
	cin >> s;
	int y = 0, m = 0, d = 0;
	int x = 1000;
	for(int i = 0; i < 4; i++)
	{
		y += (s[i] - ‘0‘) * x;
		x = x / 10;
	}
	x = 10;
	for(int i = 4; i < 6; i++)
	{
		m += (s[i] - ‘0‘) * x;
		x = x / 10;
	}
	x = 10;
	for(int i = 6; i < 8; i++)
	{
		d += (s[i] - ‘0‘) * x;
		x = x / 10;
	}
	solve(y, m, d);
	printf("%s\n%s", ans1, ans2);
	return 0;
}

日期模拟

原文:https://www.cnblogs.com/K2MnO4/p/13874402.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!