【TSOJ课程】20 1151 玛雅日历
课程29_20 1151 玛雅日历
题目:
题目描述:
上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法。这个Haab历法拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu。这些月份中的日期用0到19表示。Haab历的最后一个月叫做uayet,它只有5天,用0到4表示。玛雅人认为这个日期最少的月份是不吉利的,在这个月法庭不开庭,人们不从事交易,甚至没有人打扫屋中的地板。
因为宗教的原因,玛雅人还使用了另一个历法,在这个历法中年被称为Tzolkin(holly年),一年被分成13个不同的时期,每个时期有20天,每一天用一个数字和一个单词相组合的形式来表示。使用的数字是1-13,使用的单词共有20个,它们分别是:imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau。
注意:年中的每一天都有着明确唯一的描述,比如,在一年的开始,日期如下描述: 1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10 ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6 canac, 7 ahau, ,8 imix, 9 ik, 10 akbal ……也就是说数字和单词各自独立循环使用。
Haab历和Tzolkin历中的年都用数字0,1,……表示,数字0表示世界的开始。所以第一天被表示成:
Haab: 0 pop 0
Tzolkin: 1 imix 0
请帮助M.A. Ya教授写一个程序可以把Haab历转化成Tzolkin历。
输入描述:
第一行表示要转化的Haab 历的数据量。下面的每一行表示一个日期。
Haab历中的数据由如下的方式表示:日期 月份 年数。其中年数小于5000。
输出描述:
每一行表示一个对应的Tzolkin 历日期。Tzolkin 历中的数据由如下的方式表示: 天数字 天名称 年数。
样例输入:
3
10 zac 0
0 pop 0
10 zac 1995
样例输出:
3 chuen 0
1 imix 0
9 cimi 2801
解析:
非常有意思的一道题,只要弄清楚了就会很简单。
题目讲到了两种历法
第一种是类似公历的历法,叫Haab(哈勃)历,每个月都是固定的20天,最后一个月是5天,一共365天。
需要注意的是日期是从0开始的,每个月的最后一天的日期是19。第二种则是类似我国天干地支的历法,叫Tzolkin(锉金)历。由两部分组成,前面那个部分每13个数字轮回一次,后面那个部分每20次轮回一次。
每过一天,两个部分都会前进一格,比如1 1的下一天是2 2。而两个部分各不相干,比如13 13的下一天是1 14,7 20的下一天是8 1。
那么我们很快就会意识到,对于第二种,当出现过一次1 1以后,下一次出现1 1的间隔就应该是两个轮回的最小公倍数,13和20的最小公倍数是260,也就是说这种历法的一年就是260天。
这种历法很类似于天干地支,中国古代用天干地支记录年份,天干有10个,地支有12个,所以古代年份是60一个轮回,所以“一甲子”就指的是60年,因为10和12的最小公倍数是60。
扯远了,我们要做的是把用第一种历法描述的日期转化为第二种历法的情况。
两种历法的月份名:
pop | no | zip | zotz | tzec | xul | yoxkin | mol | chen | yax | zac | ceh | mac | kankin | muan | pax | koyab | cumhu |
---|
imix | ik | akbal | kan | chicchan | cimi | manik | lamat | muluk | ok | chuen | eb | ben | ix | mem | cib | caban | eznab | canac | ahau |
---|
思路非常简单,首先求出距离Haab历元年(0年pop月0日)的天数,Haab历的一年是365天,那么这个天数应该等于year*365 + mon*20 + day
,其中year、mon、day分别为年、月、日。
在这里需要注意:虽然Haab历的最后一个月只有5天,但是其实我们不需要对它进行特别处理,原因很简单:如果给出的是最后一个月的某一天,那么它距离本年年初的天数应该是月份*20
加上日期
,而这个月究竟有几天不会影响结果。
然后求Tzolkin历。先求年,因为Tzolkin历一年是260天,所以我们把上面求出来的day整除掉260,就是年份了。
接着月份和日期的求法非常非常简单,因为上面说过月份和日期两个部分互不干扰的,比如过去了21天,那么月份就应该是21余13=8,日期就是21余20=1。
解题:
代码中的from_mondate
是用来把Haab历的某月某日转化成此天到年初的时间。比如传入(pop,1),就会返回1。因为年初的日期就是0,所以最后返回的部分其实是m*20 + date-0
,然后-0被省略。
注意Tzolkin历的日期是从1开始的,输出时需要+1。
参考代码:
// TSOJ-1151 玛雅日历
#include <iostream>
#include <string>
using namespace std;string tranha[] = {"pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen","yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};
string trantz[] = {"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};int from_mondate(string smon, int date)
{int m;for(int i=0;i<19;i++)if(smon == tranha[i]){m=i;break;}return m*20+date;
}int main()
{int date,year,n,day,nyear,nmon,ndate;string smon;cin>>n;for(;n--;){cin>>date>>smon>>year;day = year*365+from_mondate(smon, date);nyear = day/260;day %= 260;nmon = day%20;ndate = day%13;cout<<ndate+1<<' '<<trantz[nmon]<<' '<<nyear<<endl;}return 0;
}
【TSOJ课程】20 1151 玛雅日历相关推荐
- c语言课程设计 日历显示,c语言课程设计_电子日历.doc
c语言课程设计_电子日历 第 PAGE \* Arabic \* MERGEFORMAT 14 页第 PAGE \* Arabic \* MERGEFORMAT 14 页 课 程 设 计( 论 文 ) ...
- 电子记事本java代码_JAVA课程设计报告电子钟日历记事本
JAVA课程设计报告电子钟日历记事本 课课程程设设计计 报报告告 ( 2012-- 2013 年度第年度第 2 学期学期) 日历记事本日历记事本 专业专业计算机科学与技术计算机科学与技术 学生姓名学生 ...
- 【TSOJ课程】19 1150 细菌繁殖
课程29_19 1150 细菌繁殖 题目: 题目描述: 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,--.现在给出第一天的日期和细菌 ...
- c语言课程设计之桌面日历(完整源码+注释)
为了应付c语言课程设计,挑了个简单的题目随便写了写 题目描述: 桌面日历 1) 按照输入的年份,显示这一年每月日历. 2) 按照输入的年份和月份,显示这个月的日历. 3)显示当月的日历. 日历显示形式 ...
- android 日历 课程设计,课程设计-数字日历的设计
课设终于结束了,反倒没有了刚开始的茫然与无奈,复杂变简单,心理使然. 说的是两周的时间,而实际上真正只有6天的时间在实验室,做的快的,只用了5天的时间. 前三天是忙碌的EWB仿真实验.我做了两遍,不一 ...
- 小学生C++编程基础 课程20(共7题)
978.插入前面 (课程D) 难度:1 登录 979.插入中间 (课程D) 难度:1 登录 980.删除中间数 (课程D) 难度:1 登录 981.删中间2个数 (课程D) 难度:1 登录 982.删 ...
- java课程设计日历记事本_《Java程序设计》课程设计日历记事本.doc
<Java程序设计>课程设计日历记事本 PAGE PAGE 2 本科生课程设计 课程名称 Java程序设计课程设计 课程编号 j1620011 题目 日历记事本 学号 2008116222 ...
- 对计算机学院建设性意见,计通学院云平台优质课程建设实施意见
随着云平台-"学宝"系统(简称学宝)的进一步完善,目前我院所有专业(包括本部.城南)一至三年级所有学生已经配备虚拟桌面.为进一步利用好学宝平台,结合学院和各门课程实际情况进行教学创 ...
- SQL2005 BI系列课程
标题 系列 技术 讲师 时间 视频 SQL Server 2005 BI系列课程(20):数据挖掘实践在架构设计中的常见问题以及性能提升策略(下) SQL2005 BI系列课程 SQL Server ...
- python课件_如何20小时搞定Python量化期权实战?
<Python量化期权实战应用>课程,在预售初期就备受关注,课程开始上线以来,内容更是受到了广大学员的一致好评. 眼看着课程就快要更新完毕了,如果还没有开始学习的同学要抓紧时间了. 课程总 ...
最新文章
- centos7.5 升级kernel内核版本
- 不可逆的类初始化过程
- ntdll.dll和ntoskrnl.exe中的NT*和ZW*函数区别
- 成绩排序 九度教程c语言,九度OJ 1089 数字反转
- Pull Request的正确打开方式(如何在GitHub上贡献开源项目)
- uuntu中ant的解压安装
- python计算机图形学_图形图像学习随笔:计算机图形学的一些基本概念
- 【力扣】NO.1.两数之和
- 树莓派 zero cpu:elpida b4432bbpa-1d
- Linux 升级glibc-2.14 失败 我遇到的问题
- 深入理解JVM虚拟机(总结篇)
- JCMsuite 纳米光学仿真分析
- 鸟与虫(六)拉勾网,我可不可以找到工作
- 创业和工作的心态问题
- 对策论基础---矩阵对策的解法
- 数据分析项目:用户消费行为分析
- Rotten Tomatoes 电影数据分析
- 银河麒麟系统FT2000 ARM64平台源码编译grub2并制作启动U盘 引导启动长城UF716笔记本
- 计算机咋么开远程桌面权限,怎么将win10系统电脑中的允许远程桌面访问权限打开...
- JRE和JDK的解释及区别
热门文章
- android捕获全局异常lin,全局获取 (Activity)Context,实现全局弹出 Dialog
- 计算机网络家庭网络设计,为家庭设计一个局域网
- Unity 2D图片添加加外边框Shader
- jink下载出现:Failed to download RAMCode . Failed to prepare for programming .
- 富媒体广告投放的一些经验
- 注解@NotEmpty、@NotBlank、@NotNull三者的区别及使用范围
- 台式计算机把光驱改成硬盘,笔记本电脑光驱怎么改成硬盘|笔记本光驱位换成硬盘方法...
- Python项目:爬取智联招聘网站的数据分析职位信息并进行可视化分析
- 应有尽有,Python 程序员需要掌握的机器学习“四大名著”发布啦
- 计算机自动维护有用吗,Win10怎么开启自动维护功能?系统自动维护有什么作用?...