PTA 玛雅日历

上周末, 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值