上周末, M. A. Ya 教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用Haab 历法,一年有 365 天。 Haab 历法每年有 19 个月,在前 18 个月,每月有 20 天,月份的名字分别是 pop, no, zip, zotz, tzec, xul, yoxkin,mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu 。这些月份中的日期用 0 到 19 表示; Haab 历的最后一个月叫做 uayet ,
它只有 5 天,用 0 到 4 表示。玛雅人认为这个日期最少的月份是不吉利的:在这个月,法庭不开庭,人们不从事交易,甚至不打扫房屋。因为宗教的原因,玛雅人还使用了另一个历法,这个历法中年被称为 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, 10ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6canac, 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 历
输入格式:
• Haab 历中的数据由如下的方式表示:
• NumberOfTheDay. Month Year (日期 . 月份 年数)
• 输入中的第一行表示要转化的 Haab 历日期的数据量。接下来的每一行表示一个日期,年数小于 5000 。
输出格式:
• Tzolkin 历中的数据由如下的方式表示:
• Number NameOfTheDay Year (天数字 天名称 年数)
• 第一行表示输出的日期数量。下面的每一行表示一个输入数据中对应的 Tzolkin 历中的日期。
输入样例:
3 10. zac 0 0. pop 0 10. zac 1995
输出样例:
3 3 chuen 0 1 imix 0 9 cimi 2801
不得不说,这题挺折磨人的
2024/4/10日更新优美版本
#include<bits/stdc++.h>
#define _ 0
using namespace std;
string link1[25] = {"pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen","yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};
string link2[25] = {"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};
signed main(){
int t;cin>>t;
cout<<t<<endl;
while(t--){
string a,b;
int y,m,d=0;
cin>>a>>b>>y;
a.pop_back();// 弹出日期最后的小数点
d = stoi(a);// 字符串转整数
for(int i=0; i<20; i++)if(link1[i] == b) m = i;//找到相对应的月份
int sum = d;// sum 是 从第0天开始,过去了几天
sum += y * 365;// 不能加上当年的
sum += m * 20;// 同理当月还没过完,所以也不能加
int yy = sum / 260;
int mm = sum % 20;// 这里参考天干地支纪年,月份和日期各模各的
int dd = sum % 13;
cout<<dd+1<<" "<<link2[mm]<<" "<<yy<<endl;
}
return ~~(0^_^0);
}
老版本
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int t;
cin>>t;
cout<<t<<endl;;
map<string,int>mp;
mp["pop"]=1;mp["no"]=2;mp["zip"]=3;mp["zotz"]=4;mp["tzec"]=5;mp["xul"]=6;mp["yoxkin"]=7;mp["mol"]=8;
mp["chen"]=9;mp["yax"]=10;mp["zac"]=11;mp["ceh"]=12;mp["mac"]=13;mp["kankin"]=14;mp["muan"]=15;mp["pax"]=16;
mp["koyab"]=17;mp["cumhu"]=18;
string link[22]={"ahau","imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};
while(t--){
int Day ,Year;
string mons;
char c;
cin>>Day>>c>>mons>>Year;
int sum = 0;
sum = Year*365;
if(mons!="uayet"){
sum += mp[mons]*20-20;
sum += Day+1;
}else{
sum+= 18*20 + Day+1;
}
int y = sum/260;
if(sum%260==0){
y--;
}
sum -= y*260;
int mm,dd;
mm = sum%13;
if(mm==0)mm =13;
dd = sum%20;
if(sum==0)dd =1;
else if(dd==0)dd =20;
cout<<mm<<" "<<link[dd]<<" "<<y<<endl;
}
return 0;
}