Poj_1008--Maya Calendar
一、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; }else year=days/260; day=days % 260; int num; if(day % 13 ==0) num=13; else num=day % 13; int c=day%20; System.out.println(num+" "+changeDays(c)+" "+year); } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。