Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 67726 | Accepted: 20893 |
Description
因为宗教的原因,玛雅人还使用了另一个历法,在这个历法中年被称为Tzolkin(holly年),一年被分成13个不同的时期,每个时期有20天,每一天用一个数字和一个单词相组合的形式来表示。使用的数字是1~13,使用的单词共有20个,它们分别是:imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau。注意:年中的每一天都有着明确唯一的描述,比如,在一年的开始,日期如下描述:
1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 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 ……也就是说数字和单词各自独立循环使用。
Haab历和Tzolkin历中的年都用数字0,1,……表示,数字0表示世界的开始。所以第一天被表示成:
Haab: 0. pop 0
Tzolkin: 1 imix 0
请帮助M.A. Ya教授写一个程序可以把Haab历转化成Tzolkin历。
Input
日期. 月份 年数
输入中的第一行表示要转化的Haab历日期的数据量。下面的每一行表示一个日期,年数小于5000。
Output
天数字 天名称 年数
第一行表示输出的日期数量。下面的每一行表示一个输入数据中对应的Tzolkin历中的日期。
Sample Input
3 10. zac 0 0. pop 0 10. zac 1995
Sample Output
3 3 chuen 0 1 imix 0 9 cimi 2801
Source
Translator
北京大学程序设计实习, Xie Di
解题思路:
这题没什么好说的,就是一个简单的模拟题了,但是要注意这两种计年法之间的联系和差异,也就是说,该怎么认真的理清这两种关系显的尤为的重要.对于第一种纪年法,也就是我们输入的数据,他是说,有18个月,每个月有20天,再有一个月,这个月是5天,记为0 1 2 4.365天算一年.
第二种纪年法是说,天数是由1-13的循环,月份是由1-20个单词的循环,260天算作一年,所以我们只需要认真的理清这个关系就好了,首先由输入的数据计算出days,然后把days传到第二种纪年方法中,由day = days%260%13+1,month = days%260%20+1, year = days/260.
对应在建立起由1-19和1-20的映射就行了.
代码:
# include<cstdio> # include<iostream> # include<string> using namespace std; int n,days; void init() { int day; int year; int month; string mon; cin>>day; getchar(); getchar(); cin>>mon; cin>>year; if (mon == "pop")month = 1; if (mon == "no")month = 2; if (mon == "zip")month = 3; if (mon == "zotz")month = 4; if (mon == "tzec")month = 5; if (mon == "xul")month = 6; if (mon == "yoxkin")month = 7; if (mon == "mol")month = 8; if (mon == "chen")month = 9; if (mon == "yax")month = 10; if (mon == "zac")month = 11; if (mon == "ceh")month = 12; if (mon == "mac")month = 13; if (mon == "kankin")month = 14; if (mon == "muan")month = 15; if (mon == "pax")month = 16; if (mon == "koyab")month = 17; if (mon == "cumhu")month = 18; if (mon == "uayet")month = 19; days = day + (month-1)*20+year*365; } void work() { int year; int month; int day; year = days/260; month = days%260%20+1; day = days%260%13+1; cout<<day<<" "; switch( month ) { case 1: cout << "imix";break; case 2: cout << "ik";break; case 3: cout << "akbal";break; case 4: cout << "kan";break; case 5: cout << "chicchan";break; case 6: cout << "cimi";break; case 7: cout << "manik";break; case 8: cout << "lamat";break; case 9: cout << "muluk";break; case 10: cout << "ok";break; case 11: cout << "chuen";break; case 12: cout << "eb";break; case 13: cout << "ben";break; case 14: cout << "ix";break; case 15: cout << "mem";break; case 16: cout << "cib";break; case 17: cout << "caban";break; case 18: cout << "eznab";break; case 19: cout << "canac";break; case 20: cout << "ahau";break; } cout<<" "<<year<<endl; } int main(void) { int n;cin>>n; cout<<n<<endl; while ( n-- ) { init(); work(); } return 0; }