这应该算一种加密题目吧。题目应该不难,但是我wa了很多次。。。
因为我复制粘贴的时候少复制了一个月的名字,难受。
算法就是先算出总天数减1(因为从零开始)。
然后因为减一了所以除260啊,模13啊什么的都不用考虑太复杂了。
#include <stdio.h>
#include <string.h>
//虽然两个结构一模一样,但是为了可读性还是定义了两个
//(根本就是定义完了发现一样但懒得删除)
struct Haab{
int n;
char m[10];
int y;
};
struct Tzolkin{
int n;
char m[10];
int y;
};
Tzolkin ans[5000];
char holly[20][10] = { "imix", "ik", "akbal", "kan",
"chicchan", "cimi", "manik", "lamat",
"muluk", "ok", "chuen", "eb", "ben", "ix",
"mem", "cib", "caban", "eznab", "canac", "ahau"
};
//就是它,最后一个uayet没复制进来,wa好多次
char hab[19][10] = {"pop", "no", "zip", "zotz",
"tzec", "xul", "yoxkin", "mol", "chen",
"yax", "zac", "ceh", "mac",
"kankin", "muan", "pax", "koyab", "cumhu","uayet"
};
int main()
{
Haab in;
int n;
scanf("%d", &n);
for(int x = 0; x < n; x++)
{
scanf("%d. %s %d", &in.n, in.m, &in.y);
int days = in.y * 365;
for(int i = 0; i < 19; i++)
if( strcmp(in.m, hab[i]) == 0)
{
days += i * 20;
break;
}
days += in.n;//因为日是从0开始,所以days是实际天数减一
//所以下面的就能直接算,不用考虑整倍数
ans[x].y = days / 260;
strcpy(ans[x].m, holly[days % 20]);
ans[x].n = days % 13 + 1;
}
printf("%d\n", n);
for(int i = 0 ; i < n; i++)
printf("%d %s %d\n", ans[i].n, ans[i].m, ans[i].y);
return 0;
}
唔,我因为期末考试复习了c语言,所以习惯c写,以后尽量用c++。
不写了,学c++去。