日期问题系列

一、星期几的循环

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;
}

二、回文日期

ACWing.466 回文日期

暴力 :需要直接枚举所有日期,考虑的情况较多

枚举所有回文,然后判断

#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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值