OpenJudge NOI 1.13 08:特殊日历计算
【题目链接】
OpenJudge NOI 1.13 08:特殊日历计算
【题目考点】
1… 取模运算
【解题思路】
我们用的是现实日历,题目中设定的是特殊日历,两种历法的一天是一样长的。也就是说两种历法的秒的长度是不一样的。
先输入现实日历的日期。
1. 求时分秒
求出从当天0时0分0秒到当前时间h时m分s秒的总秒数ts,为ts=h*3600+m*60+s
现实日历中一天为 24 ∗ 60 ∗ 60 = 86400 24*60*60=86400 24∗60∗60=86400秒,特殊日历中一天为 10 ∗ 100 ∗ 100 = 100000 10*100*100=100000 10∗100∗100=100000秒。
将现实日历的秒数转为特殊日历中的秒数,需要做 t s / 86400 ∗ 100000 = t s ∗ 125 / 108 ts/86400*100000=ts*125/108 ts/86400∗100000=ts∗125/108,即ts = ts*125/108
而后在特殊日历中:
ts%100
为秒数,ts/100%100
为分钟数,ts/10000
为小时数。
2. 求日月年
把2000年1月1日当做第0天,求出该日期是第几天。
设一个函数getDayNum获取y年m月d日是从2000年1月1日起的第几天。
- i从2000遍历到y-1,根据第i年是否是闰年统计每年的天数,加和。
- i从1遍历到m-1,统计第i月的天数,加和。
- 最后天数加上d-1(由于日期从1开始)
用getDayNum函数求出总天数td,而后将该天数转为特殊日历中的日、月、年。
特殊日历中10天一周,10周一个月,也就是100天一个月。10个月1年。由于日、月从1开始,所以求出的数值要加1。
td%100+1
即为日,td/100%10+1
即为月,td/1000
为年。
【题解代码】
解法1:
#include<bits/stdc++.h>
using namespace std;
bool isLeap(int y)//y是否是闰年
{return y%400 == 0 || y%100 != 0 && y%4 == 0;
}
int getDayNum(int y, int m, int d)
{int day = 0;//从2000.1.1到y年m月d日的总天数for(int i = 2000; i < y; ++i){if(isLeap(i))day += 366;elseday += 365;}for(int i = 1; i < m; ++i){if(i == 2) day += isLeap(y) ? 29 : 28;else if(i == 4 || i == 6 || i == 9 || i == 11)day += 30;elseday += 31;}day += d-1;return day;
}
int main()
{int n, k, h, mi, s, d, mo, y, td, ts;scanf("%d", &n);while(n--){scanf("%d:%d:%d %d.%d.%d", &h, &mi, &s, &d, &mo, &y);//h:时 mi:分 s:秒 d:日 mo:月 y:年 ts = h*3600+mi*60+s;//从0:0:0到h:mi:s的总秒数 ts = ts*125/108;//将现实日历中的秒数转为特殊日历中的秒数。 s = ts%100, ts /= 100;//特殊日历下的秒、分、时 mi = ts%100, ts /= 100;h = ts;td = getDayNum(y, mo, d);//从1.1.2000到d.mo.y的总天数 d = td%100+1, td /= 100;//特殊日历下的日、月、年 mo = td%10+1, td /= 10;//日、月从1开始,所以要加1 y = td;printf("%d:%d:%d %d.%d.%d\n", h, mi, s, d, mo, y);//注意:月日从1开始}return 0;
}
解法2:
#include<bits/stdc++.h>
using namespace std;
bool isLeap(int y)//y是否是闰年
{return y%400 == 0 || y%100 != 0 && y%4 == 0;
}
int getDayNum(int y, int m, int d)
{int day = 0;//从2000.1.1到y年m月d日的总天数for(int i = 2000; i < y; ++i){if(isLeap(i))day += 366;elseday += 365;}for(int i = 1; i < m; ++i){if(i == 2) day += isLeap(y) ? 29 : 28;else if(i == 4 || i == 6 || i == 9 || i == 11)day += 30;elseday += 31;}day += d-1;return day;
}
int main()
{int n, k, h, mi, s, d, mo, y, td, ts;scanf("%d", &n);while(n--){scanf("%d:%d:%d %d.%d.%d", &h, &mi, &s, &d, &mo, &y);//h:时 mi:分 s:秒 d:日 mo:月 y:年 ts = h*3600+mi*60+s;//从0:0:0到h:mi:s的总秒数 ts = ts*125/108;//将现实日历中的秒数转为特殊日历中的秒数。 s = ts%100;//特殊日历下的秒、分、时 mi = ts/100%100;h = ts/10000;td = getDayNum(y, mo, d);//从1.1.2000到d.mo.y的总天数 d = td%100+1;//特殊日历下的日、月、年 mo = td/100%10+1;//日、月从1开始,所以要加1 y = td/1000;printf("%d:%d:%d %d.%d.%d\n", h, mi, s, d, mo, y);//注意:月日从1开始}return 0;
}
OpenJudge NOI 1.13 08:特殊日历计算相关推荐
- 信息学奥赛一本通 1013:温度表达转化 | OpenJudge NOI 1.3 08
[题目链接] ybt 1013:温度表达转化 OpenJudge NOI 1.3 08:温度表达转化 [题目考点] 1. 书写计算表达式 了解* /的优先级高于+ - 了解()可以改变运算优先级 2. ...
- OpenJudge NOI 1.13 18:Tomorrow never knows?
[题目链接] OpenJudge NOI 1.13 18:Tomorrow never knows? [题目考点] 1. 模拟 [解题思路] 模拟日期值的变化 要计算当前日期的下一天,先将" ...
- 信息学奥赛一本通 1927:【04NOIP普及组】花生采摘 | OpenJudge NOI 1.13 38:花生采摘 | 洛谷 P1086 [NOIP2004 普及组] 花生采摘
[题目链接] ybt 1927:[04NOIP普及组]花生采摘 OpenJudge NOI 1.13 38:花生采摘 洛谷 P1086 [NOIP2004 普及组] 花生采摘 [题目考点] 1. 模拟 ...
- 信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数
[题目链接] ybt 1245:不重复地输出数 OpenJudge NOI 1.11 08:不重复地输出数 [题目考点] 1. 二分查找 2. 复杂度为O(nlogn)的排序 快速排序:时间复杂度O( ...
- 信息学奥赛一本通 1175:除以13 | OpenJudge NOI 1.13 27:除以13
[题目链接] ybt 1175:除以13 OpenJudge NOI 1.13 27:除以13 [题目考点] 1. 高精度 考察:高精除低精 高精模低精 高精度计算讲解 [题解代码] 解法1:使用函数 ...
- OpenJudge NOI 1.7 08:字符替换
[题目链接] OpenJudge NOI 1.7 08:字符替换 [题目考点] 1. 字符串 [题解代码] 解法1:使用字符数组 #include <bits/stdc++.h> usin ...
- 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法
[题目链接] ybt 1307:[例1.3]高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 [题目考点] 1. 高精度 考察:高精乘高精 高精度计算讲 ...
- OpenJudge NOI 1.16 08:石头剪刀布
[题目链接] OpenJudge NOI 1.16 08:石头剪刀布 [题目考点] 1. 数组 2. 循环遍历数组 循环遍历下标为0~n-1的数组时,取下一个下标的方法为: i = (i+1)%n; ...
- 信息学奥赛一本通 1413:确定进制 | OpenJudge NOI 1.13 34:确定进制 | OpenJudge NOI 2.1 1973:确定进制
[题目链接] ybt 1413:确定进制 OpenJudge NOI 1.13 34:确定进制 OpenJudge NOI 2.1 1973:确定进制 注意:两OJ平台上题目条件不同,ybt中:2≤b ...
最新文章
- eigen 编译_OpenCV+Eigen上位机程序移植(七十一)
- python 自己写个调试工具
- python 查看字符编码,[Python]判断系统编码和字符编码chardet
- python操作系统接口错误_Python os模块和sys模块 操作系统的各种接口
- eplan可运行于linux系统吗,Eplan安装对电脑操作系统的要求
- RT-Thread I/O设备模型
- 华为交换机配置syslog发送_华为/H3C Syslog配置
- 2018-03-28 从人机交互角度看中文编程:#39;打开微信#39;
- Android WebView:这是一份全面 详细的WebView学习指南
- 为什么情人总比老婆好
- Linux之SDL2+OpenGL+EGL绘制(十六)
- 第一次使用博客,略激动。
- R语言查看包安装路径
- jdk1.7 64位官方下载地址
- photoshop 技巧
- 背景色和背景图片共存,背景图片覆盖色
- 十一、海思HISI3556V200摄像头功能裁剪
- HI618E音频解码芯片
- 结构体中元素引用—— “.“ 与 “->“
- 网络攻防之信息收集和社工技巧
热门文章
- “标杆”突围:企业的学习能力、速度及意愿
- picture 元素使用
- 80 多个 Linux 必备的监控工具
- 返回上一个页面JS/a标签
- 切换图片尝试写第一个js插件 图片轮播
- html是什么?超文本标记语言
- goldengate java_配置Goldengate向JMS(ActiveMQ)发布消息
- 美化----VS Code 文件小图标插件 “VScode icon”
- 基于B/S架构的在线考试系统的设计与实现
- 二流java程序员_一名90后二流大学程序员的自述:我是如何从“菜鸟”到“辣鸡”的...