POJ 1008

这道题是进行玛雅两种历法的转换,题目是挺水的,但是自己更水,思维陷入了如下误区:玛雅宗教历,每月有20天,20个名字,但是只有1-13的数字表示number,因此我就在想通过怎样的方式才能将数字和名字关联起来,一个以13为周期,一个以20为周期。但是今晚发现第一种历法算出的总天数,换成第二种历法的年以及不足年的天数时,对这个天数直接取20的余数,然后在与20个名字对应,就能获得当前日期的名字,之前一直纠结于Number与名字的对应,其实在总天数这个维度上,它们是相互独立的,是两种计数策略。一个以13为周期,一个以20为周期,因此分别用余下的总天数对13、20取余数就得到Number与Name,当然这道题必须考虑余数为0的情况,这意味着其实是上一个月或者上一年的最后一天。

代码如下:

import java.util.Scanner;

public class poj1008 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int loop = sc.nextInt();
		System.out.println(""+loop);
		for (int i = 0; i < loop; i++) {
			String days = sc.next();
			String months = sc.next();
			int years = sc.nextInt();
			int totalDays = 365 * years + (getMonths(months))*20
					+ Integer.parseInt(days.replace(".", ""))+1;
			int TYears = totalDays / 260;
			int TDays = totalDays % 260;
			TYears = TDays==0?TYears-1:TYears;
			int TNumber = TDays % 13;
			TNumber = TNumber==0?13:TNumber;
			int TNumberOfTheDay = TDays % 20;
			String TDayName = getDayName(TNumberOfTheDay);
			System.out.println(TNumber+" "+TDayName+" "+TYears);
		}

	}

	private static String getDayName(int tNumberOfTheDay) {
		switch (tNumberOfTheDay) {
		case 1:
			return "imix";
		case 2:
			return "ik";
		case 3:
			return "akbal";
		case 4:
			return "kan";
		case 5:
			return "chicchan";
		case 6:
			return "cimi";
		case 7:
			return "manik";
		case 8:
			return "lamat";
		case 9:
			return "muluk";
		case 10:
			return "ok";
		case 11:
			return "chuen";
		case 12:
			return "eb";
		case 13:
			return "ben";
		case 14:
			return "ix";
		case 15:
			return "mem";
		case 16:
			return "cib";
		case 17:
			return "caban";
		case 18:
			return "eznab";
		case 19:
			return "canac";
		case 0:
			return "ahau";
		default:
			return "";
		}
	}

	private static int getMonths(String str) {
		if (str.equals("pop")) {
			return 0;
		} else if (str.equals("no")) {
			return 1;
		} else if (str.equals("zip")) {
			return 2;
		} else if (str.equals("zotz")) {
			return 3;
		} else if (str.equals("tzec")) {
			return 4;
		} else if (str.equals("xul")) {
			return 5;
		} else if (str.equals("yoxkin")) {
			return 6;
		} else if (str.equals("mol")) {
			return 7;
		} else if (str.equals("chen")) {
			return 8;
		} else if (str.equals("yax")) {
			return 9;
		} else if (str.equals("zac")) {
			return 10;
		} else if (str.equals("ceh")) {
			return 11;
		} else if (str.equals("mac")) {
			return 12;
		} else if (str.equals("kankin")) {
			return 13;
		} else if (str.equals("muan")) {
			return 14;
		} else if (str.equals("pax")) {
			return 15;
		} else if (str.equals("koyab")) {
			return 16;
		}else if(str.equals("cumhu")){
			return 17;
		}else {
			return 18;
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值