当前位置: 首页 > news >正文

洛谷 NOIP2016 普及组 回文日期

这道题目本来是不难想思路的。。。。。。

然而我第一次做的时候改了蛮久才把代码完全改对,主要感觉还是不够细心,敲的时候也没注意见检查一些小错误,那么接下来不说废话,请看题干:

接下来请看输入输出的样例以及数据范围:

 

我提供两个方法去做这个题,第一个思路是:

首先我们分析容易看出输入的日期其实当作两个八位数处理即可,然后直接循环,从起始日期到截止日期,如果是回文日期,直接ans++即可,只是我们需要思考如何来让日期进行正确的进位,所以这时候我考虑使用函数来达到目的的功能,接下来请看代码:

#include<bits/stdc++.h>
using namespace std;
int d1,d2,ans;
int getday(int y,int m){//y年m月有多少天if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)return 31;if(m==4 || m==6 || m==9 || m==11)return 30;//判断闰年if(( !(y%4) && y%100) || !(y%400))return 29;else return 28;
}
int nextday(int x){//x的下一天  表示为八位整数int y=x/10000;int m=x/100%100;int d=x%100;if(d != getday(y,m))++d;else if(m!=12){++m;d=1;}else {y+=1;m=1;d=1;}return 10000*y+100*m+d;
}
int rev(int x){int ans=0;while(x){ans=ans*10+x%10;x/=10;}return ans;
}
int main(){scanf("%d%d",&d1,&d2);for(int d=d1;d<=d2;d=nextday(d)){if(d == rev(d)) ans++;}printf("%d\n",ans);return 0;
}

 看起来很长其实也并不复杂,写了几个函数,第一个函数是判断对应的月份有多少天,第二个是判断循环中的下一天的日期,第三个循环判断翻转数字是否与一开始的一样,也就是判断回文数,然后就是很简单的输入和枚举,相信不必进行解释了。

接下来我就在思考,很明显一开始的方法还是进行了很多不必要的循环,两个回文日期的间隔一般是比较大的,所以有很多不必要的循环,也就是我考虑如何降低循环的次数,同时也能降低时间复杂度,接下来请看代码:

#include<bits/stdc++.h>
using namespace std;
int d1,d2,ans;
int getday(int y,int m){//y年m月有多少天if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)return 31;if(m==4 || m==6 || m==9 || m==11)return 30;//判断闰年if(( !(y%4) && y%100) || !(y%400))return 29;else return 28;
}
int nextday(int x){//x的下一天  表示为八位整数int y=x/10000;int m=x/100%100;int d=x%100;if(d != getday(y,m))++d;else if(m!=12){++m;d=1;}else {y+=1;m=1;d=1;}return 10000*y+100*m+d;
}
int rev(int x){int ans=0;while(x){ans=ans*10+x%10;x/=10;}return ans;
}
int main(){scanf("%d%d",&d1,&d2);for(int y=1000;y<=9999;y++){int revy=rev(y);int m=revy/100;int d=revy%100;if(m>=1 && m<=12 && d>=1 && d<=getday(y,m)){int x=y*10000+revy;if(x>=d1 && x<=d2) ans++;}}printf("%d\n",ans);return 0;
}

这个方法就是将年份进行了循环,从1000循环到9999年,每次循环先判断出是否是回文年份并且这个回文年份是否在输入的起始日期和截止日期之间,如果在,那么就可以ans++,这是因为我们可以发现日期是一个八位数字,并且由于年份、月份和日子都不可以为0,所以我们其实可以把年份看成特殊进位的数字,进而只需要循环一万次不到就可以得到结果。

相关文章:

  • TensorFlow(2):Windows安装TensorFlow
  • Maths
  • myspl左外连
  • Echarts饼图tooltip渐变色,内部legend百分比保留整数方法
  • Flutter本地化(国际化)之App名称
  • 压力测试(超详细总结)
  • 【Spring实战】配置多数据源
  • [调试]stm32使用过程debug记录,持续更新ing
  • 蓝牙物联网与嵌入式开发如何结合?
  • [笔记]netty随笔
  • centos 7.4 docker
  • 【Spark源码分析】Spark的RPC通信二-初稿
  • 【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
  • Vue 3 语法和特性
  • 在Next.js和React中搭建Cesium项目
  • JS 中的深拷贝与浅拷贝
  • 【391天】每日项目总结系列128(2018.03.03)
  • 345-反转字符串中的元音字母
  • Android单元测试 - 几个重要问题
  • docker python 配置
  • download使用浅析
  • express.js的介绍及使用
  • java第三方包学习之lombok
  • JS笔记四:作用域、变量(函数)提升
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python 基础起步 (十) 什么叫函数?
  • Python连接Oracle
  • React中的“虫洞”——Context
  • SQL 难点解决:记录的引用
  • SQLServer之创建显式事务
  • Sublime Text 2/3 绑定Eclipse快捷键
  • webpack入门学习手记(二)
  • 解决iview多表头动态更改列元素发生的错误
  • 两列自适应布局方案整理
  • 小李飞刀:SQL题目刷起来!
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 进程与线程(三)——进程/线程间通信
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (003)SlickEdit Unity的补全
  • (07)Hive——窗口函数详解
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (C语言)球球大作战
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (vue)页面文件上传获取:action地址
  • (ZT)薛涌:谈贫说富
  • (附源码)ssm码农论坛 毕业设计 231126
  • (算法)Game
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .CSS-hover 的解释
  • .NET : 在VS2008中计算代码度量值
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net连接MySQL的方法