网站开发著作权,黄页内容,美食教做网站,网络科技公司logo前言
今天讲讲日期问题#xff0c;所谓日期问题#xff0c;在蓝桥杯中出现众多#xff0c;但是解法比较固定。
一般有判断日期合法性#xff0c;判断是否闰年#xff0c;判断日期的特殊形式#xff08;回文或abababab型等#xff09;
目录
例题
题2
题三
总结
…前言
今天讲讲日期问题所谓日期问题在蓝桥杯中出现众多但是解法比较固定。
一般有判断日期合法性判断是否闰年判断日期的特殊形式回文或abababab型等
目录
例题
题2
题三
总结
先枚举日期再根据题意判断而不是先模拟题意进行构造日期
判断日期合法性月份判断日判读闰年判断等
从一个八位数中一次取出年月日 例题
回文日期 题目的本意是在给定date1与date2之间找出所有的回文日期的个数
对于一个回文日期 对于此题我们有两种思路
①是构造回文日期判断日期合法性再计算符合范围的回文日期的个数。
②是先从全部枚举日期构造回文日期再判断日期的合法性与找出符合条件日期。 这里判断日期的合法性指月份必须要在12月内 日必须要在对应月份合理的天数在此还需要判断是否是闰年。 显然思路①明显比较困难 构造回文日期比较难所以我们采取思路2
所以大致思路如下 枚举日期时候我们只需枚举年份从1000到9999即前四位 通过年份构造回文日期时有以下思路 for(int i1000;i9999;i){int si,xi;for(int k0;k4;k){ss*10x%10;//x模运算是依次取出每一个数xx/10;}if(date1s sdate2 check(s)){res;}}
一个例子 代码如下
#includecstdio
int arr[]{0,31,28,31,30,31,30,31,31,30,31,30,31};//月份对应天数
bool check(int date)
{int yeardate/10000;int monthdate%10000/100;int daydate%100;if(month0||month12){return false;}if(day0||month!2 dayarr[month]){return false;}if(month2)//2月需要特判{int j year%4000||year%40year%100!0;//是闰年j为1否则为0if(dayarr[month]j||day1){return false;}}return true;
}
int main()
{int date1,date2;scanf(%d%d,date1,date2);int res0;for(int i1000;i9999;i){int si,xi;for(int k0;k4;k){ss*10x%10;xx/10;} //此时s为回文日期if(date1s sdate2 check(s)){res;}}printf(%d,res);
} 题2
回文日期2 题目本意是给出一个日期寻找下一个回文日期和ABABBABA型的日期
我们分析ABABBABA型有特殊性它也是回文日期
这样我们在回文日期种在判断它是否是ABABBABA型即可。
对于判读ABABBABA型 有以下条件
它的个位数与十位数不相等个位数与百位数相等十位数与千位数相等。 代码如下
#includecstdio
int arr[]{0,31,28,31,30,31,30,31,31,30,31,30,31};bool check(int i)//判断日期合法性
{int yeari/10000,monthi%10000/100,dayi%100;if(month0||month12){return false;}if(month!2 dayarr[month]||day0){return false;}if(month2){int jyear%4000||year%40year%100!0;if(dayarr[month]j||day0){return false;}}return true;
}
int main()
{int n;scanf(%d,n);int acc0,abb0;//判断是否第一次出现回文日期和ABABBABA式日期for(int in/10000;;i)//要一直循环{int xi,ji;for(int k0;k3;k){xx*10j%10;jj/10;}//x为构造后的回文日期if(check(x)xn)//判读日期合法性判断日期大于给定日期{if(acc!1){printf(%d\n,x);acc1;}//第一次输出回文日期int num1 x%10, num2 x/10%10, num3x/100%10, num4x/1000%10;//分别取个十百千位数if(abb!1num2!num1num1num3num2num4)//判断ABABBABA{printf(%d\n,x);abb1;}if(acc1abb1){break;}//找完跳出循环}if(acc1abb1){break;}}
} 题三
日期问题困难 例如 输入: 02/03/04 输出2002-03-04 2003-02-03 2004-03-04 本题对于输入而言有三种情况年/月/日日/月/年/月/日/年
本题中如果对给出的输入模拟出可能出现的日期比较困难不妨采取先枚举所有日期
判断日期合法性然后判断这些日期是否在给定输入的可能值里面。
代码如下
#includecstdioint arr[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int year,int month,int day)
{if(year1960||year2059)return false;if(month1||month12)return false;if(month!2){if(dayarr[month]||day1) return false;} else {int leap year%40year%100!0 || year%4000;//闰年leap为1if(dayarr[month]leap||day1){return false;}}return true;
}
int main()
{int a,b,c;scanf(%d/%d/%d,a,b,c);for(int i19600101;i20591231;i)//枚举所有日期{int yeari/10000,monthi%10000/100, dayi%100;//取出年月日if(check(year,month,day))//判断日期合法性{int yeayear%100;//取出年份的后两位 if(yeaamonthbdayc||yeacmonthadayb||yeacmonthbdaya)//判断可能的值{printf(%d-%02d-%02d\n,year,month,day);//格式化输入}}}return 0;
}注意这里输出与输入 ··scanf (%d /%d/ %d,a ,b ,c); //过滤掉输入的 / ··printf (%d-%02d-%02d\n , year,month,day); //%02d意为输出两位不足两位补上前导0 总结
这三到题都有很大的相似性 先枚举日期再根据题意判断而不是先模拟题意进行构造日期 判断日期合法性月份判断日判读闰年判断等
bool check(int date)//一个八位的日期包含年月日
{int yeardate/10000; //取出年int monthdate%10000/100; //取出月int daydate%100; //取出日if(month0||month12){return false;}if(day0||month!2 dayarr[month]){return false;}if(month2)//2月需要特判{int j year%4000||year%40year%100!0;//是闰年j为1否则为0if(dayarr[month]j||day1){return false;}}return true;//其他为合法日期返回真
} 从一个八位数中一次取出年月日
例如20201018------取2020年取10月取18 日 其中有公式 运算: %10^n ························取出一个数的后n位 / 10^n ························取出一个数的前n位 //date为一个八位数
int yeardate/10000; //取出年
int monthdate%10000/100; //取出月
int daydate%100; //取出日 本篇博客到此结束谢谢大家观看如果各位博友们有好的建议或好的想法
欢迎留言喔谢谢大家