一、星期几的循环
1. 小蓝每周六、周日都晨跑,每月的 1、11、21、31日也晨跑。其它时间不晨跑。
已知 2022年1月1日是周六,请问小蓝整个2022年晨跑多少天?
#include <bits/stdc++.h>
using namespace std;
int ans,day = 6;
int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
for(int i = 1;i <= 12;i++)
for(int j = 1;j <= months[i];j++)
{
if(day == 6 || day == 0 || j == 1 || j == 11 || j == 21 || j == 31) ans++;
day++;
day %= 7;
}
cout << ans << endl;
return 0;
}
二、回文日期
暴力 :需要直接枚举所有日期,考虑的情况较多
枚举所有回文,然后判断
#include <bits/stdc++.h>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int date) // check函数整体 逻辑:先判断不合法情况 其余 合法
{
int year = date / 10000;
int month = date % 10000 / 100;
int day = date % 100;
// 年一定合法 因为枚举1000~10000
// 判断月
if(month > 12 || month == 0) return false;
// 判断日
// 首先特判闰年
if(month == 2)
{
int leap = (year % 100 != 0 && year % 4 == 0) || year % 400 == 0;
if(day > 28 + leap) return false;
}
if(day == 0 || (month != 2 && day > days[month])) return false;
return true;
}
int main()
{
int date1,date2;
cin >> date1 >> date2;
int ans = 0;
for(int i = 1000;i < 10000;i++) // 年份最多9999
{
int date = i,x = i; // 将相同数字 从后往前每一位加入到date的最后
for(int j = 0;j < 4;j++) date = date * 10 + x % 10,x /= 10;
if((date <= date2 && date >= date1) && check(date)) ans++;
}
cout << ans << endl;
return 0;
}
问题描述(答案70910)
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
#include <bits/stdc++.h>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int date)
{
int year = date / 10000;
int month = date % 10000 / 100;
int day = date % 100;
if(month == 0 || month > 12) return false;
if(month == 2)
{
int leap = (year % 100 != 0 && year % 4 == 0) || year % 400 == 0;
if(day > 28 + leap) return false;
}
if(day == 0 || (month != 2 && day > days[month])) return false;
return true;
}
bool cmp(int date)
{
int year = date / 10000;
int month = date % 10000 / 100;
int day = date % 100;
int x = 0,y = 0,z = 0;
while(year) x += year % 10,year /= 10;
while(month) y += month % 10,month /= 10;
while(day) z += day % 10,day /= 10;
if(x == y + z) return true;
return false;
}
int main()
{
int date1 = 19000101,date2 = 99991231;
int ans = 0;
for(int i = date1;i <= date2;i++)
if(check(i)) if(cmp(i)) ans++;
cout << ans << endl;
return 0;
}