[POJ] #1008# Maya Calendar : 字符处理/同余问题

时间:2024-01-08 12:11:20
一. 题目
Maya Calendar
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 74085   Accepted: 22819

Description

During his last sabbatical, professor M. A. Ya made a surprising discovery about the old Maya calendar. From an old knotted message, professor discovered that the Maya civilization used a 365 day long year, called Haab, which had 19 months. Each of the first 18 months was 20 days long, and the names of the months were pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu. Instead of having names, the days of the months were denoted by numbers starting from 0 to 19. The last month of Haab was called uayet and had 5 days denoted by numbers 0, 1, 2, 3, 4. The Maya believed that this month was unlucky, the court of justice was not in session, the trade stopped, people did not even sweep the floor.

For religious purposes, the Maya used another calendar in which the
year was called Tzolkin (holly year). The year was divided into thirteen
periods, each 20 days long. Each day was denoted by a pair consisting
of a number and the name of the day. They used 20 names: imix, ik,
akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix,
mem, cib, caban, eznab, canac, ahau and 13 numbers; both in cycles.

Notice that each day has an unambiguous description. For example, at
the beginning of the year the days were described as follows:

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, and again in the next period 8 imix, 9 ik, 10
akbal . . .

Years (both Haab and Tzolkin) were denoted by numbers 0, 1, : : : ,
where the number 0 was the beginning of the world. Thus, the first day
was:

Haab: 0. pop 0

Tzolkin: 1 imix 0

Help professor M. A. Ya and write a program for him to convert the dates from the Haab calendar to the Tzolkin calendar.

Input

The date in Haab is given in the following format:

NumberOfTheDay. Month Year

The first line of the input file contains the number of the input
dates in the file. The next n lines contain n dates in the Haab calendar
format, each in separate line. The year is smaller then 5000.

Output

The date in Tzolkin should be in the following format:

Number NameOfTheDay Year

The first line of the output file contains the number of the output
dates. In the next n lines, there are dates in the Tzolkin calendar
format, in the order corresponding to the input dates.

Sample Input

3
10. zac 0
0. pop 0
10. zac 1995

Sample Output

3
3 chuen 0
1 imix 0
9 cimi 2801

Source

二. 题意
  • 玛雅文明有两种年历
    • Haab
      • 一年365天
      • 19个月:
      • 前18个月,每月20天;第19个月5天
      • 表示方法: 0. pop 0
        • 0.: 某月的某天, 从0开始计数
        • pop: 月的字符表示
        • 0: 年, 从0开始计数
    • Tzolkin
      • 一年260天
      • 13个周期
      • 每个周期20天
      • 表示方法: 1 imix 0
        • 1: 某个周期的某天,从1开始计数
        • imix: 周期的字符表示
        • 0: 年,从0开始计数
  • 给出某年某月某日的Haab表示
  • 输出对应的Tzolkin表示

三. 分析

  • 算法核心: 字符处理/同余问题
  • 实现细节:
    • 将Haab表示的日期,转换为从开始到当前日期的总天数
    • 根据Tzolkin的表示方法
      • 对总周期数(13) 取余数
      • 对每个周期的天数(20) 取余数, 利用其为索引获取其对应的字符表示
      • 对每年的天数(269) 取余数

四. 题解

 #include <stdio.h>

 #define H_MONTHS 19
#define H_MONTH_DAYS 20
#define H_YEAR_DAYS 365
#define H_MONTH_LEN 7 #define T_PERIODS 13
#define T_CYCLES 20
#define T_DAYS 260 char* hms[H_MONTHS] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin",
"mol", "chen", "yax", "zac", "ceh", "mac", "kankin",
"muan", "pax", "koyab", "cumhu","uayet"}; char* tds[T_CYCLES] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik",
"lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem",
"cib", "caban", "eznab", "canac", "ahau"}; int mystrcmp(const char *str1, const char *str2)
{
while (*str1 == *str2) {
if (*str1 == '\0') return ;
str1++; str2++;
} return *str1 - *str2;
} int shmonth_to_hmonth(const char *shmonth)
{
long i = ;
for (i = ; i < H_MONTHS; i++)
if ( == mystrcmp(shmonth, hms[i])) return i; return i;
} int main(void)
{
int i, N;
int hday, hmonth, hyear; scanf("%d\n", &N);
printf("%d\n", N); for (i = ; i < N; i++) {
int days = ;
char shmonth[H_MONTH_LEN]; scanf("%d. %s %d\n", &hday, shmonth, &hyear);
hmonth = shmonth_to_hmonth(shmonth); days = hyear * H_YEAR_DAYS + hmonth * H_MONTH_DAYS + hday; printf("%d %s %d\n", days % T_PERIODS + ,
tds[days % T_CYCLES],
days / T_DAYS);
} return ;
}