蓝桥杯日期相关题

前言

明天就蓝桥杯了,也不知道练啥好,记得蓝桥杯日期题挺多的,练个日期题吧(祝明天蓝桥杯的朋友,省一冲冲冲)

题目

在这里插入图片描述

代码

思路

模拟题嘛,注意细节就好,大概意思都写在代码注释里了

#include<bits/stdc++.h>
using namespace std;

int ans = 3 ;//为了方便从1月3号开始的

int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

void check( int x )
{
    if( x % 4 == 0 && x % 100 != 0 ) month[2] = 29;
    else if( x%400 == 0 ) month[2] = 29;
    else month[2] = 28 ;
}
int main()
{
    // m月份 d天数 k 是否星期一
    int m = 1 , d = 3 , k = 0 ;
    for(int year = 2000 ; year <= 2020 ; year ++ )
    {
        check( year );//判断是否闰年 闰年2月 29天 month[2] = 29;
        
        while( m <= 12 ) //循环12个月
        {
            while( d <= month[m] )//每个月 循环当月天数
            {
                k ++ ;
                ans ++ ;
                if( k%7 == 0 ) ans ++ ; // 满足是星期1 答案额外 +1;
                d ++ ;
            }
            d = 1 ; 
            if( k%7 != 0 ) ans ++ ;//如果不是星期1 且是月头 
            m ++ ;
            
            //年份是循环到 2020年底 , 当到达2020 10 1 时输出答案 
            if( year == 2020 && m == 10 && d == 1 )cout<<ans+2 ; //因为当天还没算,额外加
        }
        
        m = m%12 ;
        
    }
    return 0 ;
}

题目

在这里插入图片描述
题目取自:ACWing社区

代码

思路

枚举每个回文串,判断这个串是否是合法的日期。因为要保证回文只需要枚举前四位就好,所以数据量不大只有10^4。

#include<bits/stdc++.h>
using namespace std;

int ans = 0 , data1 , data2 ;


int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

void check( int x )
{
    if( x % 4 == 0 && x % 100 != 0 ) month[2] = 29;
    else if( x%400 == 0 ) month[2] = 29;
    else month[2] = 28 ;
}

int to_digit( string s )
{
    int ans = 0 ;
    
    for(int i = 0 ; i < s.size() ; i ++)
    {
        ans = ans*10 + s[i] - '0';
    }
    
    return ans ;
}

void work( int x )
{
    string a = to_string( x );
    string b = a ;
    reverse( b.begin() , b.end() );
    a += b ;
    
    string m = "" , d = "" , y = "";
    m += a[4] , m += a[5];
    d += a[6] , d += a[7];
    y += a[0] ,y += a[1] , y += a[2] , y += a[3] ;
    
    int months = to_digit( m ) ;
    int day = to_digit( d ) ;
    int year = to_digit( y );
    
    int nums = to_digit( a );
    
    check( year );
    
    if( nums <= data2 && nums >= data1)
    {
        if( months <= 12 && months >= 1){
            if( day <= month[months] && day >= 1 ){
                ans ++ ;
            }
        }
    }
    
    
    
    
}
int main()
{
    cin >> data1 >> data2 ;
    for(int i = 1000 ; i <= 9999 ; i++)
    {
        work( i );
    }
    cout<<ans;
    return 0 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值