鱼C论坛

 找回密码
 立即注册
查看: 1116|回复: 1

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

[复制链接]
发表于 2023-12-14 15:40:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

牛牛习惯用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[13]={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[mon])
        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;
}




哪里不对啊请问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[13] = {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[mon]))        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 13:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表