Poj_1008--Maya Calendar
来源:互联网 发布:唇釉和口红的区别知乎 编辑:程序博客网 时间:2024/06/15 02:25
一、Description
上周末,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历。
因为宗教的原因,玛雅人还使用了另一个历法,在这个历法中年被称为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历转换为天数,再把天数转换为Tzolkin历。
- 怎样去除输入数字后面的点号?
- 怎样把输入的字母型的月份转换为数字型?
- 怎样计算天数差?
- 怎样计算输出的年数、天数字?
- 怎样转换天名称?
三、问题解决
- 在读取第一个日期的时候,要用字符串存放,然后用replace方法去除“.”,再调用Integer.parseInt(),把字符串解析为整形。
String s=cin.next().replace(".", "");
int day=Integer.parseInt(s.trim()); - 没什么好办法,只能用if-else语句暴力解决,逐个判断输出对应数字。注意数字是从1还是还是从0开始,这与后面的计算有关。
- 计算天数差时要注意由于haab历的天数用0~19表示,所以真正的天数要在输入的基础上加1.而月份如果转换的时候用1~19则月份要减1。年数从0开始,不需要变 。 int days=day+1+(month-1)*20+year*365;
- 计算输出的时候就要注意了,如果天数差是260的整数倍,则年数减1.而在求天数字时,如果天数是13的倍数,则天数就为13。
- 天名称就用年内天数与20取余,再用if--else把数字转换为字符型的表示形式。
import java.util.Scanner;public class Main {public static int changeMonths(String str){if(str.equals("pop"))return 1;else if(str.equals("no"))return 2;else if(str.equals("zip"))return 3;else if(str.equals("zotz"))return 4;else if(str.equals("tzec"))return 5;else if(str.equals("xul"))return 6;else if(str.equals("yoxkin"))return 7;else if(str.equals("mol"))return 8;else if(str.equals("chen"))return 9;else if(str.equals("yax"))return 10;else if(str.equals("zac"))return 11;else if(str.equals("ceh"))return 12;else if(str.equals("mac"))return 13;else if(str.equals("kankin"))return 14;else if(str.equals("muan"))return 15;else if(str.equals("pax"))return 16;else if(str.equals("koyab"))return 17;else if(str.equals("cumhu"))return 18;else if(str.equals("uayet"))return 19;return -1;}public static String changeDays(int i){if(i == 1){return "imix";}else if(i == 2){return "ik";}else if(i == 3){return "akbal";}else if(i == 4){return "kan";}else if(i == 5){return "chicchan";}else if(i == 6){return "cimi";}else if(i == 7){return "manik";}else if(i == 8){return "lamat";}else if(i == 9){return "muluk";}else if(i == 10){return "ok";}else if(i == 11){return "chuen";}else if(i == 12){return "eb";}else if(i == 13){return "ben";}else if(i == 14){return "ix";}else if(i == 15){return "mem";}else if(i == 16){return "cib";}else if(i == 17){return "caban";}else if(i == 18){return "eznab";}else if(i == 19){return "canac";}else {return "ahau";}}public static void main(String[] args) {Scanner cin=new Scanner(System.in);int times=cin.nextInt();System.out.println(times);for(int i=0;i<times;i++){String s=cin.next().replace(".", "");int day=Integer.parseInt(s.trim());int month=changeMonths(cin.next());int year=cin.nextInt();int days=day+1+(month-1)*20+year*365;if(days % 260==0){year=days/260-1;}elseyear=days/260;day=days % 260;int num;if(day % 13 ==0)num=13;elsenum=day % 13;int c=day%20;System.out.println(num+" "+changeDays(c)+" "+year);}}}
- [POJ_1008]Maya Calendar
- Poj_1008--Maya Calendar
- poj_1008 Maya Calendar(模拟题)
- Maya Calendar
- Maya Calendar
- Maya Calendar
- Maya Calendar
- Maya Calendar
- POJ 1008 Maya Calendar
- fjnu 1203 Maya Calendar
- 1008 Maya Calendar
- poj 1008 Maya Calendar
- pku 1008 Maya Calendar
- POJ 1008 Maya Calendar
- 1008 Maya Calendar
- 1008 Maya Calendar
- POJ 1008 Maya Calendar
- 【POJ】1008 Maya Calendar
- NS2中无线trace分析(第3课)
- JavaScript继承详解(四)
- 冒泡排序算法原理与实现
- 面向程序员的数据库访问性能优化法则
- 鄙人java面试题库
- Poj_1008--Maya Calendar
- mysql基础回顾
- 设计模式之适配器模式
- 飘逸的python - __dict__的妙用
- MyEclipse中利用Jetty部署web工程的问题
- MinGW的安装
- CentOS6.3下压力测试工具Siege的并发测试
- 正则表达式集合
- C语言中嵌入汇编