小小wu~ 发表于 2023-12-14 15:40:16

在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

题目描述
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月份,最后2位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。

牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现 在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存 在的日期是回文的。

一个8位数字是回文的,当且仅当对于所有的i
(1≤i≤8
)从左向右数的第i
个 数字和第9−i
个数字(即从右向左数的第i
个数字)是相同的。

例如:

对于2016年11月19日,用8位数字20161119表示,它不是回文的。
对于2010年1月2日,用8位数字20100102表示,它是回文的。
对于2010年10月2日,用8位数字20101002表示,它不是回文的。
每一年中都有12个月份:

其中,1,3,5,7,8,10,12月每个月有31天;4,6,9,11月每个月有30天;而对于2月,闰年时有29天,平年时有28天。

一个年份是闰年当且仅当它满足下列两种情况其中的一种:

这个年份是4的整数倍,但不是100的整数倍;
这个年份是400的整数倍。
例如:

以下几个年份都是闰年:2000,2012,2016。
以下几个年份是平年:1900,2011,2014。
输入描述
两行,每行包括一个8位数字。

第一行表示牛牛指定的起始日期date1


第二行表示牛牛指定的终止日期date2


题目数据保证:

date1
—定不晚于 date2

都是真实存在的日期;
年份部分一定为4位数字;
首位数字不为0;
输出描述
一个整数,表示在date1
和date2
之间,有多少个日期是回文的。

样例
输入 复制
20110101
20111231
输出 复制
1
输入 复制
20000101
20101231
输出 复制
2





我的代码如下:
#include<bits/stdc++.h>
using namespace std;
int days={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool hefa(int date)
{
    int year=date/10000;
    int mon=date/100%100;
    int day=date%100;
    if(mon==0||mon>12)
    return false;
    if(day==0||mon!=2&&day>days)
      return false;
    if(mon==2)
    {
      int leap=year%100!=0&&year%4==0||year%400==0;
            if(day>28+leap)
            {
                return false;
            }
    }
}
int main()
{
    int date1,date2;
    cin>>date1;
    cin>>date2;
    int i,count=0,sum=0;
    for(i=1000;i<10000;i++)
    {
      int date=i,x=i;
      while(i)
      {
            sum=sum*10+i%10;
            i=i/10;
      }
      if(date1<=date2&&date<=date2&&hefa(date))
      {
            count++;
      }
    }
    cout<<count<<endl;
}




哪里不对啊请问

FishC 发表于 2023-12-14 15:40:45

你的代码已经接近正确了,只需要在原有的基础上进行一些修改。

首先,在hefa函数中,你需要在最后加上return true;来表示日期是合法的。否则,如果日期符合条件,在函数末尾没有返回值,会导致编译错误。

其次,在主函数main中,你计算日期个数的循环条件应该是i <= date2 - date1 + 1,而不是i <= date2 - date1。这是因为题目要求包括起始和终止日期本身。另外,你还需要在循环中加上一个计数器count,每当检查到一个回文日期时,将count加1。最后输出count即可。

下面是修改后的完整代码:

#include<iostream>
using namespace std;

int days = {0,31,28,31,30,31,30,31,31,30,31,30,31};

bool hefa(int date)
{
    int year = date / 10000;
    int mon = date / 100 % 100;
    int day = date % 100;
   
    if(mon == 0 || mon > 12)
      return false;
   
    if(day == 0 || (mon != 2 && day > days))
      return false;
   
    if(mon == 2)
    {
      bool leap = (year % 100 != 0 && year % 4 == 0) || (year % 400 == 0);
      if(day > 28 + leap)
            return false;
    }
   
    return true;
}

int main()
{
    int date1, date2;
    cin >> date1;
    cin >> date2;
   
    int count = 0;
    for(int i = date1; i <= date2; i++)
    {
      if(hefa(i))
            count++;
    }
   
    cout << count << endl;
   
    return 0;
}

希望能对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。