题目概述:
有两种历法,Haab历和Tzolkin历
Haab历一年19个月,前18个月都是20天,每个月名称依次为pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu,最后一个月5天,名称为uayet,每个月第一天是0日,最后一天是19日或4日,历法元年为0年
Tzolkin历一年有260天,一天以时期和编号二者确定,有13个时期,名称为imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau,编号从1到20,从每年第一天(1 imix)开始,每天编号和时期都会递增到下一个,当到达末尾时会循环回首个名称/编号,历法元年为0年
输入:
第一行times,其后每行一个Haab历法表示的日期,以%dd%,%m%,%yy%表示日,月,年,则格式为
%dd%. %m% %yy%
注意%dd%后有一个点
输入有times组
限制:
年<5000
输出:
第一行一个整数times,其后每行一个字符串,对应Tzolkin历日期,以%ddd%,%mmmm%,%yyy%表示编号,时期,年,则格式为
%ddd% %mmmm% %yyy%
注意没有点号
多组输入之间没有空行
样例输入:
3
10. zac 0
0. pop 0
10. zac 1995
样例输出:
3
3 chuen 0
1 imix 0
9 cimi 2801
讨论:
其实就是个计算题,不过扯上字符串就变得很烦人了,利用map和数组下标性质,还是个计算题
由于5天的特殊月在最后一个月,因此完全不影响计算
另外这里cin和printf混用了,但这两个并不影响
题解状态:
252K,0MS,C++,1315B
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
#define maxx(a,b) ((a)>(b)?(a):(b))
#define minn(a,b) ((a)<(b)?(a):(b))
#define MAXN 105
map<string, int>months;
char months2[20][10] = { "imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau" };
void fun()
{
int dd, mm, yy;
char c;//放多余的点号
string m;
cin >> dd >> c >> m >> yy;//input//不知道scanf可否用string,于是用cin
mm = months[m];//利用map还原为数字
int days = 0;
days += yy * 365 + mm * 20 + dd;//计算出过去多少天,这两行的状况只是意外,没有特殊含义
int ddd, mmm, yyy;
yyy = days / 260;
days %= 260;
mmm = days % 20;
ddd = days % 13 + 1;//需要注意编号从1开始
printf("%d %s %d\n", ddd, months2[mmm], yyy);
}
int main(void)
{
//freopen("vs_cin.txt", "r", stdin);
//freopen("vs_cout.txt", "w", stdout);
months["pop"] = 0;
months["no"] = 1;
months["zip"] = 2;
months["zotz"] = 3;
months["tzec"] = 4;
months["xul"] = 5;
months["yoxkin"] = 6;
months["mol"] = 7;
months["chen"] = 8;
months["yax"] = 9;
months["zac"] = 10;
months["ceh"] = 11;
months["mac"] = 12;
months["kankin"] = 13;
months["muan"] = 14;
months["pax"] = 15;
months["koyab"] = 16;
months["cumhu"] = 17;
months["uayet"] = 18;//可以看到月份都减一了,因为月份记录已经完整经过的月数
int times;
cin >> times;//input
printf("%d\n", times);//output
while (times--) {
fun();
}
}
EOF