顺子日期(c语言)

题目:

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小明特别喜欢顺子。顺子指的就是连续的三个数字: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;
}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值