题目: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):


 #include <iostream>
#include <string>
using namespace std;
void showDate(){
char allStr[][] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu","uayet"};
int totalDays=year*;
string result;
char resultChar[][]={ "imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"};
for(int i=;i<;i++){
if(strcmp(month,allStr[i])==){
totalDays+=i*;
break;
}
}
totalDays+=(day+);
int resultMonth=totalDays%;
if(resultMonth==)
result="ahau";
else
result=resultChar[totalDays%-];
int date = totalDays%;
if(date==){
date=;
}
cout<<date<<" ";
int currentYear = totalDays/;
if(totalDays%==&&currentYear>){
currentYear--;
}
cout<<result<<" ";
cout<<currentYear<<endl;
}
int main()
{
int number = ;
int index=;
char line[];
cin>>number;
int day=;
int year=;
char skip;
char month[];
cout<<number<<endl;
while(index<number){
cin>>day>>skip>>month>>year;
showDate (day,month,year);
index++;
}
return ;
}

总结:

要注意边界值的处理,在计算年份的时候,如果不仔细的话有可能会出错。比如说,通过计算得出总天数为260,刚好是Tzolkin一年的时间,但是仍然算作是第1年。

ACM1008的更多相关文章

  1. ACM1008:Elevator

    Problem Description The highest building in our city has only one elevator. A request list is made u ...

  2. hd acm1008

    Problem Description The highest building in our city has only one elevator. A request list is made u ...

  3. C# ACM poj1008

    玛雅历 public static void Acm1008(int day, string mon, int year) { ; switch (mon) { case "pop" ...

随机推荐

  1. 洛谷 [P2701] 巨大的牛棚

    首先,本题是一道最大子矩阵问题,且m,n较小,可以使用DP做, 与 洛谷 [P1387]最大正方形 做法相同. #include <iostream> #include <cstdi ...

  2. BZOJ 3720: Gty的妹子树 [树上size分块]

    传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...

  3. CodeChef Chef and Churu [分块]

    题意: 单点修改$a$ 询问$a$的区间和$f$的区间和 原来普通计算机是这道题改编的吧... 对$f$分块,预处理$c[i][j]$为块i中$a_j$出现几次,$O(NH(N))$,只要每个块差分加 ...

  4. 关于.NET C#上传大文件的解决办法

    1.最近在解决问题的时候遇到如何将视频以及语音和图片上传到阿里云的服务器中.但是遇到一些大文件就导致无法进行上传. 2.在将图片进行上传到阿里云的时候先将文件转化为二进制文件,然后通过文件流 的形式进 ...

  5. Codewars练习

    记录一下比较聪明的codewars练习题解决方案,不得转载. 2017/12/19 You will be given a string and you task is to check if it ...

  6. 一步一步从原理跟我学邮件收取及发送 11.完整的发送示例与go语言

    经过了这个系列的前几篇文章的学习,现在要写出一个完整的 smtp 邮件发送过程简直易如反掌.    例如我们可以轻松地写出以下的纯 C 语言代码(引用的其他C语言文件请看文末的 github 地址): ...

  7. CSS3 @keyframes 用法(简单动画实现)

    定义: 通过 @keyframes 规则,能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,可以多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或 ...

  8. Javascript获取数组中的最大值和最小值方法汇总

    方法一 sort()方法 b-a从大到小,a-b从小到大 var max2 = arr.sort(function(a,b){ return b-a; })[0]; console.log(max2) ...

  9. Docker Centos6 下建立 Docker 桥接网络

    cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0  ifcfg-br0 vi ifcfg-eth0 //增加BRIDGE=br0,删除IPADDR,N ...

  10. angular+require前端项目架构搭建

    app //应用入口 directive //自定义指令 require-main //require的主配置文件  存放公共调用的js service //请求后端数据公有类 controllers ...