ACM1008

题目: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的日期算出总天数就可以解决问题。

所以算法的步骤如下:

  1. 根据Haab的输入日期计算出总天数。
  2. 根据总天数计算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&&currentYear>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年。

posted on 2015-11-28 16:09  学会分享~  阅读(324)  评论(0编辑  收藏  举报

导航