• 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年。

  • 相关阅读:
    Linux系统中日志级别详情
    android测试和iOS测试的区别
    React Router的Route的使用
    React中this.props的主要属性
    2019 年 React 学习路线图(转)
    Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean (default-clean) on project
    Maven笔记
    优化Android Studio/Gradle构建(转)
    Java相关查询记录
    自己电脑组一个Wifi热点
  • 原文地址:https://www.cnblogs.com/yonghao/p/5002870.html
Copyright © 2020-2023  润新知