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

二、问题分析

       这个问题我觉得没什么大的问题,就是要注意一下小的细节以及一些特殊情况的考虑。大致上,我们要把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;
    			}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);
    		}
    	}
    }
    


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值