鱼C论坛

 找回密码
 立即注册
查看: 466|回复: 3

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

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

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

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

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
之间,有多少个日期是回文,





求求这个啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-14 19:29:19 | 显示全部楼层
好的,下面给出一种实现思路和代码。

首先,我们需要编写一个函数来判断一个8位数字是否是回文的。我们可以将这个数字转换成字符串,然后使用字符串的切片操作来比较前4位和后4位是否相同。

接下来,我们需要遍历从date1到date2之间的每个日期,并计算有多少个日期是回文的。我们可以使用两个嵌套的循环,外层循环遍历年份,内层循环遍历月份。在内层循环中,根据月份和闰年情况来确定该月份的天数,并遍历每一天判断是否是回文的。

最后,我们需要统计回文日期的数量并输出结果。

下面是完整的代码实现:
  1. def is_palindrome(num):
  2.     num_str = str(num)
  3.     return num_str[:4] == num_str[4:][::-1]
  4. def count_palindromic_dates(date1, date2):
  5.     count = 0
  6.    
  7.     year1 = int(date1[:4])
  8.     year2 = int(date2[:4])
  9.     month1 = int(date1[4:6])
  10.     month2 = int(date2[4:6])
  11.     day1 = int(date1[6:])
  12.     day2 = int(date2[6:])
  13.    
  14.     for year in range(year1, year2+1):
  15.         for month in range(1, 13):
  16.             if year == year1 and month < month1:
  17.                 continue
  18.             if year == year2 and month > month2:
  19.                 continue
  20.             
  21.             if month in [1, 3, 5, 7, 8, 10, 12]:
  22.                 days_in_month = 31
  23.             elif month == 2:
  24.                 if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
  25.                     days_in_month = 29
  26.                 else:
  27.                     days_in_month = 28
  28.             else:
  29.                 days_in_month = 30
  30.             
  31.             for day in range(1, days_in_month+1):
  32.                 if year == year1 and month == month1 and day < day1:
  33.                     continue
  34.                 if year == year2 and month == month2 and day > day2:
  35.                     continue
  36.                
  37.                 date = int(f"{year:04d}{month:02d}{day:02d}")
  38.                 if is_palindrome(date):
  39.                     count += 1
  40.    
  41.     return count
  42. date1 = input()
  43. date2 = input()
  44. count = count_palindromic_dates(date1, date2)
  45. print(count)
复制代码

希望能帮助到你!如果有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-14 19:40:44 | 显示全部楼层
还有没有另一种思路啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-14 19:41:08 | 显示全部楼层
小小wu~ 发表于 2023-12-14 19:40
还有没有另一种思路啊

当然,还有其他一种思路可以解决这个问题。我们可以直接遍历从date1到date2之间的每个日期,并判断每个日期是否是回文的。具体步骤如下:

1. 将date1和date2转换成整数类型。
2. 初始化一个计数器count,用来记录回文日期的数量。
3. 从date1开始,循环遍历每个日期,直到date2为止。
4. 在每次循环中,判断当前日期是否是回文的,如果是,则计数器count加1。
5. 最后输出计数器count的值。

下面是另一种实现方式的完整代码:
  1. def is_palindrome(num):
  2.     num_str = str(num)
  3.     return num_str == num_str[::-1]
  4. def count_palindromic_dates(date1, date2):
  5.     count = 0
  6.    
  7.     year1 = int(date1[:4])
  8.     month1 = int(date1[4:6])
  9.     day1 = int(date1[6:])
  10.    
  11.     year2 = int(date2[:4])
  12.     month2 = int(date2[4:6])
  13.     day2 = int(date2[6:])
  14.    
  15.     for year in range(year1, year2+1):
  16.         for month in range(1, 13):
  17.             if year == year1 and month < month1:
  18.                 continue
  19.             if year == year2 and month > month2:
  20.                 continue
  21.                
  22.             days_in_month = 31
  23.             if month in [4, 6, 9, 11]:
  24.                 days_in_month = 30
  25.             elif month == 2:
  26.                 if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
  27.                     days_in_month = 29
  28.                 else:
  29.                     days_in_month = 28
  30.                         
  31.             for day in range(1, days_in_month+1):
  32.                 if year == year1 and month == month1 and day < day1:
  33.                     continue
  34.                 if year == year2 and month == month2 and day > day2:
  35.                     continue
  36.                 date = int(f"{year:04d}{month:02d}{day:02d}")
  37.                 if is_palindrome(date):
  38.                     count += 1
  39.                     
  40.     return count
  41. date1 = input()
  42. date2 = input()
  43. count = count_palindromic_dates(date1, date2)
  44. print(count)
复制代码

希望这次解法也能满足你的需求!如果还有其他问题,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 15:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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