(C)蓝桥杯2020省赛--回文日期题解

博客详细解析了2020年蓝桥杯省赛中的一道关于回文日期的题目,强调了在处理循环条件时要确保能覆盖所有输入情况,尤其是上界89991231作为特殊情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

注意N的上界89991231也会当做一个输入用例,若循环条件设的不够大会导致该例不能通过

#include <stdio.h>
#include <stdlib.h>

int IsLeapYear(int i);
int NextDay(int i);

int main(int argc, char *argv[])
{
  int n;
  int flag1,flag2;
  int i,j,k;
  char str[8];
  int find1=0;
  scanf("%d",&n);
  for(i=n;i<=100000000;i=NextDay(i))
  {
    flag1=flag2=1;
    j=i;//i,j保存年份
    for(k=0;k<8;k++)//20200202->20200202
    {
      str[7-k]=j%10;
      j/=10;
    }

    for(k=0;k<4;k++)//判断回文
    {     
      if(str[k]!=str[7-k])
        {
          flag1=0;
          break;
        }    
    }

    if(find1==0 && flag1==1)//未输出过回文,且找到目标回文
    {
      printf("%d\n",i);
      find1++;
    }
    else if(find1==1)//不再输出回文
      find1=-1;

    for(k=0;k<4;k+=2)//判断进阶回文
    {
      int a,b;
      a=str[0],b=str[1];
      if(str[k]!=a || str[k+1]!=b)
      {
        flag2=0;
        break;
      }
    }

    if(flag1 && flag2)
    {
      printf("%d",i);
      break;
    }

  }

  return 0;
}

int IsLeapYear(int i)//四位年份,是否闰年
{
  if((i%4==0 && i%100) || i%400==0)
    return 1;//y
  return 0;//n
}

int NextDay(int i)//返回下一个有效日期,正序年月日
{
  int y=i/10000;//年
  int d=i%100;//日
  int m=((i-d)/100)%100;//月
  int ri;//返回值

  d++;
  if(IsLeapYear(i/10000))//是闰年
  {
    if(d==30 && m==2)
    {
      d=1;
      m++;
    } 
  } 

  else//不是闰年
    if(d==29 && m==2)
    {
      d=1;
      m++;
    }  

  if(d==31 &&(m==4 || m==6 || m==9 || m== 11))//其它月份
  {
    d=1;
    m++;
  }
  else if(d==32 &&(m==1 || m==3 || m==5 || m== 7 || m==8 || m==10))
  {
    d=1;
    m++;
  }
  else if(d==32 && m==12)
  {
    d=m=1;
    y++;
  }

  return y*10000+m*100+d;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值