当前位置:   article > 正文

刷题日记(一):“顺子日期”_20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个

20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺

 前言:

        我打算通过发博客的方式来记录我自己从零开始备战蓝桥杯中遇到的一些我认为比较不好理解的题(因为我是菜鸡,很多题都不是很懂),以便我以后可以反复回来观看研究,这样我又会有新的理解。

一、题目描述:

        小明特别喜欢顺子。顺子指的就是连续的三个数字: 123.456等。顺子日期指的就是在日期的 yyyymmdd 表示法中存在任意连续的三位数是一个顺子的日期。例如 20220123就是一个顺子日期,因为它出现了一个顺子: 123; 而20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?

二、分析:

        题目要求为2022年,因此我们只需要考虑月份和天数这两者就可以了,这两者有4个数字。我们也要考虑2022年是闰年还是平年,闰年的二月有29天,平年有28天。

 三、过程:       

        首先先建立一个月份数组,分别表示12个月份中的天数

int months[]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年的12月天数

         然后判断一年是闰年还是平年(闰年返回true,平年返回false):

  1. bool check(int year){
  2. if(year%100==0){
  3. if(year%400==0){
  4. return true;
  5. }
  6. else{
  7. return false;
  8. }
  9. }
  10. else{
  11. if(year%4==0){
  12. return true;
  13. }
  14. else{
  15. return false;
  16. }
  17. }
  18. }

获取月份的字符串形式

  1. string get_string(int x){
  2. string ans="";
  3. if(x<10){
  4. //x是3
  5. ans+="0";
  6. ans+=(char)('0'+x);
  7. }
  8. else{
  9. //12
  10. int tmp1=x/10;
  11. int tmp2=x%10;
  12. ans+=(char)('0'+tmp1);
  13. ans+=(char)('0'+tmp2);
  14. }
  15. return ans;
  16. }

传入一个月份或者天数(类型为整数),如果为一位数,则需要添加数字0在这个数前面,如果为两位数就不用,如:一月一日0101和十月十日1010。

疑问:为什么要加'0'?

有人可能会有疑问:为什么将整形x强制转换为字符类型时要先加一个'0'呢?为什么不能是下面这样呢?

ans=(char)(x);

这就要提到类型的转换有精度的损失这个问题上了。

我们都知道C语言可以强制类型转换,今天就让我们看看int和char之间的转换。

例如:

  1. #include<stdio.h>
  2. int main(){
  3. int a = 9;
  4. char b = '8';
  5. printf("%c\n",(char)a);
  6. printf("%d",(int)b);
  7. return 0;
  8. }

 运行结果为:

出乎我们的意料,简直跟我们所想要的答案完全不一样 

原因: 强制类型转换并不是想转成啥样就转成啥样。它是有精度的损失的。


(1)从长字节数据类型转换为短字节数据类型,会产生截断:
如从4字节的int类型转换成1个字节的char类型,则取int数据的最低的一个字节。
(2)从短字节类型转换为长字节类型
从char转换为int:则在前面的三个字节补符号位,即补上0xffffff(char的首位为1),或0x000000(char的首位为0)。
 

 解决方法:通过ASCII码的加减变化,在要转换的数据中加个'0'或者减个'0'

  1. #include<stdio.h>
  2. int main(){
  3. int a = 9;
  4. char b = '8';
  5. printf("%c\n",(char)(a+'0'));
  6. printf("%d",(int)(b-'0'));
  7. return 0;
  8. }

 运行结果:

————————————————
版权声明:本文为CSDN博主「大佬也拖不动的油瓶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_48089202/article/details/116277817

继续:

判断顺子,传入的是一整串格式正确的日期字符串

变量cnt用于标记一个顺子的长度,last作顺子末端位置,it是迭代器。

  1. int get_ans(string x){
  2. int cnt=0;
  3. char last;
  4. for(auto it:x){
  5. if(cnt==0){
  6. cnt=1;
  7. last=it;
  8. }
  9. else{
  10. if(it-last==1){
  11. cnt+=1;
  12. last=it;
  13. }
  14. else{ //0 1 3
  15. cnt=1;
  16. last=it;
  17. }
  18. }
  19. if(cnt>=3){
  20. return 1;
  21. }
  22. }
  23. return 0;
  24. }

然后获得月份和天数的具体数字,并输出结果:

  1. void solve(){
  2. if(check(2022)){
  3. months[1]+=1;
  4. }
  5. int ans=0;
  6. for(int i=1;i<=12;i++){
  7. string pre="2022";
  8. //i是月份
  9. string month_string=get_string(i);
  10. for(int j=1;j<=months[i-1];j++){
  11. //j是天数
  12. string day_string=get_string(j);
  13. string final=pre+month_string+day_string;
  14. ans+=get_ans(final);
  15. }
  16. }
  17. cout<<ans<<"\n";
  18. }

最后main函数中运行: 

  1. signed main(){
  2. int t=1;
  3. while(t--){
  4. solve();
  5. }
  6. }

得到结果: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/398751
推荐阅读
相关标签
  

闽ICP备14008679号