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