题目:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明特别喜欢顺子。顺子指的就是连续的三个数字: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;
}