【题目链接】

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:特殊日历计算相关推荐

  1. 信息学奥赛一本通 1013:温度表达转化 | OpenJudge NOI 1.3 08

    [题目链接] ybt 1013:温度表达转化 OpenJudge NOI 1.3 08:温度表达转化 [题目考点] 1. 书写计算表达式 了解* /的优先级高于+ - 了解()可以改变运算优先级 2. ...

  2. OpenJudge NOI 1.13 18:Tomorrow never knows?

    [题目链接] OpenJudge NOI 1.13 18:Tomorrow never knows? [题目考点] 1. 模拟 [解题思路] 模拟日期值的变化 要计算当前日期的下一天,先将" ...

  3. 信息学奥赛一本通 1927:【04NOIP普及组】花生采摘 | OpenJudge NOI 1.13 38:花生采摘 | 洛谷 P1086 [NOIP2004 普及组] 花生采摘

    [题目链接] ybt 1927:[04NOIP普及组]花生采摘 OpenJudge NOI 1.13 38:花生采摘 洛谷 P1086 [NOIP2004 普及组] 花生采摘 [题目考点] 1. 模拟 ...

  4. 信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数

    [题目链接] ybt 1245:不重复地输出数 OpenJudge NOI 1.11 08:不重复地输出数 [题目考点] 1. 二分查找 2. 复杂度为O(nlogn)的排序 快速排序:时间复杂度O( ...

  5. 信息学奥赛一本通 1175:除以13 | OpenJudge NOI 1.13 27:除以13

    [题目链接] ybt 1175:除以13 OpenJudge NOI 1.13 27:除以13 [题目考点] 1. 高精度 考察:高精除低精 高精模低精 高精度计算讲解 [题解代码] 解法1:使用函数 ...

  6. OpenJudge NOI 1.7 08:字符替换

    [题目链接] OpenJudge NOI 1.7 08:字符替换 [题目考点] 1. 字符串 [题解代码] 解法1:使用字符数组 #include <bits/stdc++.h> usin ...

  7. 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法

    [题目链接] ybt 1307:[例1.3]高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 [题目考点] 1. 高精度 考察:高精乘高精 高精度计算讲 ...

  8. OpenJudge NOI 1.16 08:石头剪刀布

    [题目链接] OpenJudge NOI 1.16 08:石头剪刀布 [题目考点] 1. 数组 2. 循环遍历数组 循环遍历下标为0~n-1的数组时,取下一个下标的方法为: i = (i+1)%n; ...

  9. 信息学奥赛一本通 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 ...

最新文章

  1. eigen 编译_OpenCV+Eigen上位机程序移植(七十一)
  2. python 自己写个调试工具
  3. python 查看字符编码,[Python]判断系统编码和字符编码chardet
  4. python操作系统接口错误_Python os模块和sys模块 操作系统的各种接口
  5. eplan可运行于linux系统吗,Eplan安装对电脑操作系统的要求
  6. RT-Thread I/O设备模型
  7. 华为交换机配置syslog发送_华为/H3C Syslog配置
  8. 2018-03-28 从人机交互角度看中文编程:#39;打开微信#39;
  9. Android WebView:这是一份全面 详细的WebView学习指南
  10. 为什么情人总比老婆好
  11. Linux之SDL2+OpenGL+EGL绘制(十六)
  12. 第一次使用博客,略激动。
  13. R语言查看包安装路径
  14. jdk1.7 64位官方下载地址
  15. photoshop 技巧
  16. 背景色和背景图片共存,背景图片覆盖色
  17. 十一、海思HISI3556V200摄像头功能裁剪
  18. HI618E音频解码芯片
  19. 结构体中元素引用—— “.“ 与 “->“
  20. 网络攻防之信息收集和社工技巧

热门文章

  1. “标杆”突围:企业的学习能力、速度及意愿
  2. picture 元素使用
  3. 80 多个 Linux 必备的监控工具
  4. 返回上一个页面JS/a标签
  5. 切换图片尝试写第一个js插件 图片轮播
  6. html是什么?超文本标记语言
  7. goldengate java_配置Goldengate向JMS(ActiveMQ)发布消息
  8. 美化----VS Code 文件小图标插件 “VScode icon”
  9. 基于B/S架构的在线考试系统的设计与实现
  10. 二流java程序员_一名90后二流大学程序员的自述:我是如何从“菜鸟”到“辣鸡”的...