题意:玛雅人有两种历法:第一种:一年有365天,分为19个月,前18个月每月有20 天,最后一个月有5天,每个月的名字非别为:pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu,uayet。每个月天数从0开始,即前18个月0-19,第19个月是0-4.
第二种: 把一年分为13 个阶段,分为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。循环。
先输入第一种历法,输出第二种历法。
解题方法:这道题是数学问题。只要计算出第一种历法距离第一天的总天数sum。那么第二种历法的天数为sum%13+1。月份为sum%20。年数sum/260.
#include <iostream>
#include <string>
using namespace std;
string a[19] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan","pax", "koyab", "cumhu","uayet"};
string b[20] = {"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};
int sum[19] = {0} ;
void init()
{
int i;
for(i = 1 ; i < 19 ; i ++)
sum[i] = sum[i-1] +20 ;
}
int main()
{
int t , m , n ,sum1 ;
char c;
string s;
cin >> t ;
int k = t ;
init();
cout << k << endl ;
while(t--)
{
sum1 = 0 ;
cin >> m ;
cin >> c ;
cin >> s ;
cin >> n ;
int i ;
for(i = 0 ; i < 19 ; i ++)
{
if(a[i]==s)
sum1 = m + sum[i] + n * 365 ;
}
cout << sum1 % 13 + 1 << " " << b[sum1 % 20] << " " << sum1 / 260 << endl ;
}
return 0;
}