洛谷 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,所以我们其实可以把年份看成特殊进位的数字,进而只需要循环一万次不到就可以得到结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点云从入门到精通技术详解100篇-基于激光点云的隧道病害检测

目录 前言 国内外研究现状 国内研究现状 国外研究现状 点云数据处理 2.1 三维激光扫描技术 2.2 点云数据特点及建立索引结构 2.3 点云数据处理 2.3.1 点云拼接 2.3.2 点云去噪 2.3.3 点云分割 2.3.4 点云投影 2.3.5 点云转化灰度图 基于激光点云的隧道裂缝提取 …

java并发编程八 CAS 与 volatile和原子整数与原子引用

文章目录 CAS 与 volatile慢动作分析volatile为什么无锁效率高CAS 的特点 原子整数原子引用不安全实现安全实现-使用锁安全实现-使用 CAS CAS 与 volatile 在java并发编程七六中&#xff0c;可以看到的 AtomicInteger 的解决方法&#xff0c;内部并没有用锁来保护共享变量的线…

Wavesurfer.js绘制波形图

HTML使用Wavesurfer.js 要使用wavesurfer.js&#xff0c;首先需要在HTML文件中引入Wavesurfer.js库&#xff0c;然后创建一个音频元素并将其添加到页面中。接下来&#xff0c;初始化Wavesurfer实例并配置相关选项。以下是一个简单的示例&#xff1a; 在HTML文件中引入Wavesurf…

PHP初学习

PHP 基础知识 <?php #这是一个注释echo "<h1>hello world</h1>"; //字符串拼接$message"hello";$name"你好";$message."".$name;echo "<br>";//单引号与双引号的区别&#xff0c;单引号无法解析变量…

音视频类App广告变现如何破局,最大化广告变现收益,让应用增收?

音视频App已然成为了我们日常获取、发布和交换信息的重要方式&#xff0c;在音视频行业不断的拓展中&#xff0c;用户的渗透率提升。 据数据显示&#xff0c;我国网络视听用户的规模已达9亿人次&#xff0c;网民使用率也突破了90%。庞大的市场规模和用户需求吸引了大批开发者和…

云工作流 CloudFlow 重磅发布,流程式开发让云上应用构建更简单

为了让企业和开发者更快速、便捷地进行云上开发&#xff0c;阿里云重磅发布云工作流&#xff08;CloudFlow&#xff09;&#xff0c;它是一款强大的面向开发者的流程编排开发工具&#xff0c; 全托管、高并发、高可用&#xff0c;帮助用户简化和自动化复杂的云上业务流程和工作…

LTO-3 磁带机种草终于是用上了

跑来跑去&#xff0c;买了不少配件&#xff0c;终于是把这磁带机给用上了&#xff0c;已经备份好了300 多 GB 的数据。 我们用了 NAS 的数据压缩功能&#xff0c;把需要备份的文件用 NAS 压缩成一个 Zip 文件&#xff0c;如果你可以 tar 的话也行。 这样传输速度更快&#xf…

论文阅读——llava

Visual Instruction Tuning LLaVA 指令智能体分为两类&#xff1a;端到端的&#xff0c;通过LangChain[1]/LLM[35]协调各种模型的系统。 数据集生成用GPT辅助生成的&#xff0c;具体不写了。 模型结构&#xff1a; input image Xv LLM&#xff1a;Vicuna visual encoder&a…

【大数据】NiFi 中的 Controller Service

NiFi 中的 Controller Service 1.Service 简介1.1 Controller Service 的配置1.1.1 SETTING 基础属性1.1.2 PROPERTIES 使用属性1.1.3 COMMENT 页签 1.2 Service 的使用范围 2.全局参数配置3.DBCPConnectionPool 的使用样例4.在 ExcuseGroovyScript 组件中使用 Service 1.Servi…

华为---登录USG6000V防火墙---console、web、telnet、ssh方式登录

目录 一、环境搭建 二、第一次登录USG6000V防火墙&#xff0c;即通过console方式登录 三、用户配置 四、web登录USG6000V防火墙 1. 用web创建的用户通过web方式登录USG6000V防火墙 2. 命令行创建的用户通过web方式登录USG6000V防火墙 五、ssh方式登录USG6000V防火墙 1. 用…

在线时间戳是什么?

在线时间戳是基于国际标准结合PKI密码技术及数字签名技术&#xff0c;对电子数据产生的精确时间进行固证&#xff0c;为电子数据提供时间证明的一种在线服务。时间戳技术使用数字签名技术对包含原始文件信息、签名参数、签名时间等信息构成的对象进行数字签名。访问沃通CA官网了…

通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能

作者&#xff1a;韦鑫&#xff0c;Higress Committer&#xff0c;来自南京航空航天大学分布式系统实验室 导读&#xff1a;本文将和大家一同回顾 Spring Cloud Gateway 是如何满足 HTTP 请求/响应转换需求场景的&#xff0c;并为大家介绍在这种场景下使用 Higress 云原生网关的…