课程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 玛雅日历相关推荐

  1. c语言课程设计 日历显示,c语言课程设计_电子日历.doc

    c语言课程设计_电子日历 第 PAGE \* Arabic \* MERGEFORMAT 14 页第 PAGE \* Arabic \* MERGEFORMAT 14 页 课 程 设 计( 论 文 ) ...

  2. 电子记事本java代码_JAVA课程设计报告电子钟日历记事本

    JAVA课程设计报告电子钟日历记事本 课课程程设设计计 报报告告 ( 2012-- 2013 年度第年度第 2 学期学期) 日历记事本日历记事本 专业专业计算机科学与技术计算机科学与技术 学生姓名学生 ...

  3. 【TSOJ课程】19 1150 细菌繁殖

    课程29_19 1150 细菌繁殖 题目: 题目描述: 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,--.现在给出第一天的日期和细菌 ...

  4. c语言课程设计之桌面日历(完整源码+注释)

    为了应付c语言课程设计,挑了个简单的题目随便写了写 题目描述: 桌面日历 1) 按照输入的年份,显示这一年每月日历. 2) 按照输入的年份和月份,显示这个月的日历. 3)显示当月的日历. 日历显示形式 ...

  5. android 日历 课程设计,课程设计-数字日历的设计

    课设终于结束了,反倒没有了刚开始的茫然与无奈,复杂变简单,心理使然. 说的是两周的时间,而实际上真正只有6天的时间在实验室,做的快的,只用了5天的时间. 前三天是忙碌的EWB仿真实验.我做了两遍,不一 ...

  6. 小学生C++编程基础 课程20(共7题)

    978.插入前面 (课程D) 难度:1 登录 979.插入中间 (课程D) 难度:1 登录 980.删除中间数 (课程D) 难度:1 登录 981.删中间2个数 (课程D) 难度:1 登录 982.删 ...

  7. java课程设计日历记事本_《Java程序设计》课程设计日历记事本.doc

    <Java程序设计>课程设计日历记事本 PAGE PAGE 2 本科生课程设计 课程名称 Java程序设计课程设计 课程编号 j1620011 题目 日历记事本 学号 2008116222 ...

  8. 对计算机学院建设性意见,计通学院云平台优质课程建设实施意见

    随着云平台-"学宝"系统(简称学宝)的进一步完善,目前我院所有专业(包括本部.城南)一至三年级所有学生已经配备虚拟桌面.为进一步利用好学宝平台,结合学院和各门课程实际情况进行教学创 ...

  9. SQL2005 BI系列课程

    标题 系列 技术 讲师 时间 视频 SQL Server 2005 BI系列课程(20):数据挖掘实践在架构设计中的常见问题以及性能提升策略(下) SQL2005 BI系列课程 SQL Server ...

  10. python课件_如何20小时搞定Python量化期权实战?

    <Python量化期权实战应用>课程,在预售初期就备受关注,课程开始上线以来,内容更是受到了广大学员的一致好评. 眼看着课程就快要更新完毕了,如果还没有开始学习的同学要抓紧时间了. 课程总 ...

最新文章

  1. centos7.5 升级kernel内核版本
  2. 不可逆的类初始化过程
  3. ntdll.dll和ntoskrnl.exe中的NT*和ZW*函数区别
  4. 成绩排序 九度教程c语言,九度OJ 1089 数字反转
  5. Pull Request的正确打开方式(如何在GitHub上贡献开源项目)
  6. uuntu中ant的解压安装
  7. python计算机图形学_图形图像学习随笔:计算机图形学的一些基本概念
  8. 【力扣】NO.1.两数之和
  9. 树莓派 zero cpu:elpida b4432bbpa-1d
  10. Linux 升级glibc-2.14 失败 我遇到的问题
  11. 深入理解JVM虚拟机(总结篇)
  12. JCMsuite 纳米光学仿真分析
  13. 鸟与虫(六)拉勾网,我可不可以找到工作
  14. 创业和工作的心态问题
  15. 对策论基础---矩阵对策的解法
  16. 数据分析项目:用户消费行为分析
  17. Rotten Tomatoes 电影数据分析
  18. 银河麒麟系统FT2000 ARM64平台源码编译grub2并制作启动U盘 引导启动长城UF716笔记本
  19. 计算机咋么开远程桌面权限,怎么将win10系统电脑中的允许远程桌面访问权限打开...
  20. JRE和JDK的解释及区别

热门文章

  1. android捕获全局异常lin,全局获取 (Activity)Context,实现全局弹出 Dialog
  2. 计算机网络家庭网络设计,为家庭设计一个局域网
  3. Unity 2D图片添加加外边框Shader
  4. jink下载出现:Failed to download RAMCode . Failed to prepare for programming .
  5. 富媒体广告投放的一些经验
  6. 注解@NotEmpty、@NotBlank、@NotNull三者的区别及使用范围
  7. 台式计算机把光驱改成硬盘,笔记本电脑光驱怎么改成硬盘|笔记本光驱位换成硬盘方法...
  8. Python项目:爬取智联招聘网站的数据分析职位信息并进行可视化分析
  9. 应有尽有,Python 程序员需要掌握的机器学习“四大名著”发布啦
  10. 计算机自动维护有用吗,Win10怎么开启自动维护功能?系统自动维护有什么作用?...