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历。

二、问题分析

       这个问题我觉得没什么大的问题,就是要注意一下小的细节以及一些特殊情况的考虑。大致上,我们要把Haab历转换为天数,再把天数转换为Tzolkin历。

  1. 怎样去除输入数字后面的点号?
  2. 怎样把输入的字母型的月份转换为数字型?
  3. 怎样计算天数差?
  4. 怎样计算输出的年数、天数字?
  5. 怎样转换天名称?

三、问题解决

  1. 在读取第一个日期的时候,要用字符串存放,然后用replace方法去除“.”,再调用Integer.parseInt(),把字符串解析为整形。

                 String s=cin.next().replace(".", "");
                 int day=Integer.parseInt(s.trim());
  2. 没什么好办法,只能用if-else语句暴力解决,逐个判断输出对应数字。注意数字是从1还是还是从0开始,这与后面的计算有关。
  3. 计算天数差时要注意由于haab历的天数用0~19表示,所以真正的天数要在输入的基础上加1.而月份如果转换的时候用1~19则月份要减1。年数从0开始,不需要变 。   int days=day+1+(month-1)*20+year*365;
  4. 计算输出的时候就要注意了,如果天数差是260的整数倍,则年数减1.而在求天数字时,如果天数是13的倍数,则天数就为13。
  5. 天名称就用年内天数与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);}}}