赞
踩
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?
最大运行时间:1s
最大运行内存: 512M
采用枚举法,从2022年1月1日进行循环,每回日期++(期间调用函数看是否要加月份),再对新日期进行判断,看这个日期是否满足顺子要求。
我是把这个日期放进数组中,对数组的前六个元素进行遍历看是否满足,但同时要求仅有三个元素满足,题目中没有说必须只有三个元素满足)
(一开始的方法)
- #include<stdio.h>
- int yi(int y)
- {
- int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
- return a[y];
- }
- int main()
- {
- //2020年是平年
- int n=2022,y=1,r=1,i,j,cnt=0,flag;
- while(1)
- {
- int a[8]={0};
- r++;
- if(r>yi(y))
- {
- r=1;
- y++;
- if(y>12)
- {
- break;
- }
- }//处理日期自增
- a[7]=r%10;
- a[6]=r/10%10;
- a[5]=y%10;
- a[4]=y/10%10;
- a[3]=n%10;
- a[2]=n/10%10;
- a[1]=n/100%10;
- a[0]=n/1000;
- //写入数组
- for(i=0;i<=5;i++)
- {
- flag=1;
- // if(a[i]==0)
- // continue;
- for(j=1;j<=2;j++)
- {
- if(a[j+i]!=a[j+i-1]+1)
- {
- flag=0;
- break;
- }
- }
- if(flag&&a[i+3]!=a[i+2]+1)//注意只有三个相邻
- {
- cnt++;
- }
- }
- }
- printf("%d\n",cnt);
- return 0;
- }
(太麻烦啦!没必要对所有的日期进行遍历,再都修改成数组的形式进行修改)
- //另一种方法的顺子日期(改良版)
- //不要上来就暴力,对所有日期进行枚举判断
- //分析2022年与后面的月份一定够不成顺子
- //即我只需要对后面的月份和日进行判断即可
- //而构成顺子日期就一定需要中间两位满足顺子的要求
- //那么就不需要枚举k了直接j+1就行
- #include<stdio.h>
- int ri(int y)
- {
- int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
- return a[y];
- }
- int main()
- {
- int num=0,i,j,k,l,y,r;
- for(i=0;i<=1;i++)//月份的十位
- for(j=0;j<10;j++)
- {
- k=j+1;
- for(l=0;l<10;l++)
- {
- y=i*10+j;
- r=k*10+l;
- if(y<=12&&r<=ri(y)&&(i+1==j||k+1==l))
- num++;
- }
- }
- printf("%d",num);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。