这道题是进行玛雅两种历法的转换,题目是挺水的,但是自己更水,思维陷入了如下误区:玛雅宗教历,每月有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;
}
}
}