题目:Haab日历和Tzolkin日历的转换。
Maya一共有两种日历,第一种日历名为Haab,将一年分为365天,一共有19个月。其中前18个月,分别命名为pop、nozip、zotz、tzec、xul、yoxkin、mol、chen、yax、zac、ceh、mac、kankin、muan、pax、koyab、cumhu,每个月一共20天,用数字0-19表示;最后一个月叫做uayet,一共只有5天,用数字0-4表示。
例子:0 pop 表示第1个月pop的第1天
另一种日历的名称为Tzolkin,将一年分为13个时期,每一个时期长20天,每一天由一个数字和一个名字标志。20个名字分别为imix、ik、akbal、kan、chicchan、cimi、manik、amat、muluk、ok、chuen、eb、ben、ix、mem、cib、caban、eznab、canac、ahau,一共有13个数字1—13。
例子:Tzolkin每一年的日历表示如下:1 imix、2 ik、3 akbal、4 kan、5 chicchan、6 cimi、7 manik、8 amat、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、11 kan、12 chicchan。
Haab和Tzolkin日历的年份由数字表示,其中0表示第1年。
通过输入Haab的当前的日期,转化为Tzolkin的日期表示形式并输出。
样例输入:
第一行输入日期的个数,第2—n行输入Haab的日期。
每一行的输入格式为:天——月份——年份
如:
3
10. zac 0
0. pop 0
10. zac 1995
结果输出:
第一行输出日期的个数,第2—n行输出结果。
输出的格式为:数字——每一天的名字——年份
结果如下:
3
3 chuen 0
1 imix 0
9 cimi 2801
程序设计的想法:
只要通过Haab的日期算出总天数就可以解决问题。
所以算法的步骤如下:
- 根据Haab的输入日期计算出总天数。
- 根据总天数计算Tzolkin对应的年份以及和天数。
源代码设计(测试时间16ms,占用内存200k):
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 void showDate(){ 5 char allStr[][19] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu","uayet"}; 6 int totalDays=year*365; 7 string result; 8 char resultChar[][20]={ "imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"}; 9 for(int i=0;i<20;i++){ 10 if(strcmp(month,allStr[i])==0){ 11 totalDays+=i*20; 12 break; 13 } 14 } 15 totalDays+=(day+1); 16 int resultMonth=totalDays%20; 17 if(resultMonth==0) 18 result="ahau"; 19 else 20 result=resultChar[totalDays%20-1]; 21 int date = totalDays%13; 22 if(date==0){ 23 date=13; 24 } 25 cout<<date<<" "; 26 int currentYear = totalDays/260; 27 if(totalDays%260==0&¤tYear>0){ 28 currentYear--; 29 } 30 cout<<result<<" "; 31 cout<<currentYear<<endl; 32 } 33 int main() 34 { 35 int number = 1; 36 int index=0; 37 char line[30]; 38 cin>>number; 39 int day=0; 40 int year=0; 41 char skip; 42 char month[10]; 43 cout<<number<<endl; 44 while(index<number){ 45 cin>>day>>skip>>month>>year; 46 showDate (day,month,year); 47 index++; 48 } 49 return 0; 50 }
总结:
要注意边界值的处理,在计算年份的时候,如果不仔细的话有可能会出错。比如说,通过计算得出总天数为260,刚好是Tzolkin一年的时间,但是仍然算作是第1年。