洛谷 P2010 回文日期 题解
P2010 回文日期
题目描述
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现 在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存 在的日期是回文的。
一个88位数字是回文的,当且仅当对于所有的i ( 1 \le i \le 8)i(1≤i≤8)从左向右数的第i个 数字和第9-i9−i个数字(即从右向左数的第ii个数字)是相同的。
例如:
•对于2016年11月19日,用88位数字2016111920161119表示,它不是回文的。
•对于2010年1月2日,用88位数字2010010220100102表示,它是回文的。
•对于2010年10月2日,用88位数字2010100220101002表示,它不是回文的。
每一年中都有1212个月份:
其中,1,3,5,7,8,10,121,3,5,7,8,10,12月每个月有3131天;4,6,9,114,6,9,11月每个月有3030天;而对于22月,闰年时有2929天,平年时有2828天。
一个年份是闰年当且仅当它满足下列两种情况其中的一种:
1.这个年份是44的整数倍,但不是100100的整数倍;
2.这个年份是400400的整数倍。
例如:
•以下几个年份都是闰年:2000,2012,20162000,2012,2016。
•以下几个年份是平年:1900,2011,20141900,2011,2014。
输入格式
两行,每行包括一个88位数字。
第一行表示牛牛指定的起始日期。
第二行表示牛牛指定的终止日期。
保证date_idate_i和都是真实存在的日期,且年份部分一定为44位数字,且首位数字不为00。
保证date 1date1 —定不晚于date 2date2。
输出格式
一个整数,表示在date1date1和date2date2之间,有多少个日期是回文的。
输入输出样例
输入 #1
20110101
20111231
输出 #1
1
输入 #2
20000101
20101231
输出 #2
2
说明/提示
【样例说明】
对于样例1,符合条件的日期是 2011110220111102。
对于样例2,符合条件的日期是 2001100220011002 和 2010010220100102 。
【子任务】
对于 60% 的数据,满足 date1 = date2date1=date2。
【思路】
模拟
难度还是很一般的模拟题目
首先,先说一下闰年这个玄学的东西,为什么要说闰年呢
因为闰年的2月有二十久天,这好像谁都知道吧
因为这个第29天的出现,导致可能会出现一个回文数,这个时候大家可能就会考虑了
每一年都判断一下是不是闰年,如果是那2月就有29天,如果不是那就有28天
其实根本不需要考虑这么复杂,如果出现这种原因可能是你还没再考虑一下的缘故
2月29构成的是0229,能和他组成回文的年份只有9220年,同时这一年也是闰年,所以这就很显然了
根本不需要管是不是闰年,每年都按照2月有29天来枚举,反正除了9220年都不会和2月29组成回文
最难搞的地方说完了
再说一下次难搞的地方
怎么判断是不是回文呢?
我的思路是这样的,在输入的时候实现吧字符串预处理为nian,yue,ri这三个变量分别储存年月日
然后枚举到每一天的时候,将ri的个位和十位换一下位置比如29号吧,就变为92,注意这里还是以数字的形式
然后同理,也将yue的各位和十位转换一下位置,加起来两个转换过后的数
如果这个数等于年,那么就是回文数
不等于就不是回文数,原理很简单我就不多赘述了
好了,两大稍微有点难度的东西解决掉了,剩下的小细节小骨头我就在代码里面标注了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s1,s2;
int x,y,z;
int nian,yue,ri;
int js = 0;
int month[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};//预处理出每一个月份里面的额天数
bool acioi()//判断是否是回文的函数
{
int qwq = (ri % 10) * 10 + ri / 10;
int owo = (yue % 10) * 10 + yue / 10;
int awa = owo + qwq * 100;
if(nian == awa)
return true;
else
return false;
}
int main()
{
cin >> s1;//输入起始
nian = (s1[0] - '0') * 1000 + (s1[1] - '0') * 100 + (s1[2] - '0') * 10 + (s1[3] - '0');
yue = (s1[4] - '0') * 10 + (s1[5] - '0');
ri = (s1[6] - '0') * 10 + (s1[7] - '0');//处理出来
cin >> s2;//输入结尾
x = (s2[0] - '0') * 1000 + (s2[1] - '0') * 100 + (s2[2] - '0') * 10 + (s2[3] - '0');
y = (s2[4] - '0') * 10 + (s2[5] - '0');
z = (s2[6] - '0') * 10 + (s2[7] - '0');//处理出来
while(nian != x || yue != y || ri != z)//没到结尾那一天就不结束
{
if(acioi() == true)//判断一下是否是闰年
js ++;//计数器累加
ri ++;//下一天
if(ri == month[yue] + 1)//这个月过完了
{
ri = 1;//下一个月的第一天
yue ++;//下一个月了
if(yue == 13)//今年过完了
{
nian ++;//下一年了
yue = 1;//下一年的第一个月
}
}
}
//从上面可以看出,最后一天也就是输入s2这一天是没有没枚举到的,所以这里在acioi一次就可以了
if(acioi() == true)
js ++;
cout << js << endl;//输出计数器
}
洛谷 P2010 回文日期 题解的更多相关文章
- 洛谷 P2010 回文日期
Noip2016普及组T2 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月 份,最后2位代表日期 ...
- P2010 回文日期 题解
这题其实就是纯暴力,暴力,再暴力,毫无技巧可言(总之您怎么乱搞都不会超时QAQ) 首先,根据题意,我们明白每年自多产生一个回文日期,因为对于每年的三百多天,前四位是固定的. 所以,我们只需要进行一个从 ...
- P2010 回文日期
P2010 回文日期 题解 回文日期,一共8位,只需要枚举4位就好了其实,然后判断它是否合法 代码 #include<bits/stdc++.h> using namespace std; ...
- 洛谷 P1217 回文质数
洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...
- #P2010 回文日期 的题解
题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日期.显然:一个日期只有 ...
- 洛谷P1217回文质数-Prime Palindrome回溯
P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include &l ...
- P2010回文日期
这道题是2016年普及组的题,难度等级为普及-. 这道题仍然是个模拟题.有两种策略:1.枚举回文,看日期是否存在2.枚举日期,看是否是回文.显然,前者要快很多,并且准确.本蒟蒻第一次便使用了后者,bu ...
- 洛谷P1435 回文子串
题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 “A ...
- 洛谷 P1015 回文数 Label:续命模拟QAQ
题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...
随机推荐
- Sql CLR创建一个简单的表值函数
1.创建面目: 2. 添加函数代码: using System; using System.Data.Sql; using Microsoft.SqlServer.Server; using Syst ...
- win7远程服务器发生身份验证错误,要求的函数不受支持
远程服务器发生身份验证错误,要求的函数不受支持,远程登录服务器以前都是正常的,今天登录远程桌面就一直是这样的错误.记录一下解决方法. 方法一:卸载补丁KB41037181.打开控制面板,找到“程序和功 ...
- 可拖拽dialog
指令的封装转自https://blog.csdn.net/sinat_21902709/article/details/86545444 可拖拽dialog应用于很多弹出框,所以需要作用于全局 在插件 ...
- CLASSPATH 环境变量设置
当 JVM 运行时,如果设置了 CLASSPATH 变量,那么 JVM 会到该目录下寻找 java 类文件 该变量配置的方式不同,寻找顺序也不同 在我的 D:\tmp\java\quickstart\ ...
- 【洛谷 P3224】 [HNOI2012]永无乡(Splay,启发式合并)
题目链接 启发式合并就是暴力合并把小的合并到大的里,一个一个插进去. 并查集维护连通性,同时保证并查集的根就是所在Splay的根,这样能省去很多操作. #include <cstdio> ...
- sshpass非交互式连接
$ sshpass -p $passwd ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $USER@$IP 'echo ...
- Count the Colors 线段树
题目 参考博客地址 题意: n范围[1,8000] , li 和 ri 的范围[0,8000]. n个操作,每个操作是把 [li , ri]内的点修改成一个颜色c. n个操作过后,按颜色从小到大 ...
- 使用Restful风格中的post使用过遇到前端数据传送不到后端
问题描述:使用postman进行请求时候,前端的数据,一直在后端接收不到,找了好多资料,竟然是因为一个注解的原因. 后端接收设置:@RequestParam@ReqeustBody设置的原因 因为sp ...
- Python 利用random库来实现圆周率的运算
蒙特卡罗方法求解圆周率 随机向一个正方形以及其内切圆(半径为1)的图形中随机抛洒大量的点,计算每个点到圆心的距离从而判断该点在圆内或圆外,用圆内的点除以总点数就是π/4的值.点数越多,值就越精确. 具 ...
- [Apio2010]patrol 巡逻
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2541 Solved: 1288[Submit][S ...