前言
明天就蓝桥杯了,也不知道练啥好,记得蓝桥杯日期题挺多的,练个日期题吧(祝明天蓝桥杯的朋友,省一冲冲冲)
题目
代码
思路
模拟题嘛,注意细节就好,大概意思都写在代码注释里了
#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 ;
}