博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POJ] #1008# Maya Calendar : 字符处理/同余问题
阅读量:6034 次
发布时间:2019-06-20

本文共 4679 字,大约阅读时间需要 15 分钟。

一. 题目
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

310. zac 00. pop 010. zac 1995

Sample Output

33 chuen 01 imix 09 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) 取余数

 

四. 题解

1 #include 
2 3 #define H_MONTHS 19 4 #define H_MONTH_DAYS 20 5 #define H_YEAR_DAYS 365 6 #define H_MONTH_LEN 7 7 8 #define T_PERIODS 13 9 #define T_CYCLES 2010 #define T_DAYS 26011 12 char* hms[H_MONTHS] = {
"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", 13 "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", 14 "muan", "pax", "koyab", "cumhu","uayet"};15 16 char* tds[T_CYCLES] = {
"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik",17 "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", 18 "cib", "caban", "eznab", "canac", "ahau"};19 20 int mystrcmp(const char *str1, const char *str2)21 {22 while (*str1 == *str2) {23 if (*str1 == '\0') return 0;24 str1++; str2++;25 }26 27 return *str1 - *str2;28 }29 30 int shmonth_to_hmonth(const char *shmonth)31 {32 long i = 0; 33 for (i = 0; i < H_MONTHS; i++)34 if (0 == mystrcmp(shmonth, hms[i])) return i;35 36 return i;37 }38 39 int main(void)40 {41 int i, N;42 int hday, hmonth, hyear;43 44 scanf("%d\n", &N);45 printf("%d\n", N);46 47 for (i = 0; i < N; i++) {48 int days = 0;49 char shmonth[H_MONTH_LEN];50 51 scanf("%d. %s %d\n", &hday, shmonth, &hyear);52 hmonth = shmonth_to_hmonth(shmonth);53 54 days = hyear * H_YEAR_DAYS + hmonth * H_MONTH_DAYS + hday;55 56 printf("%d %s %d\n", days % T_PERIODS + 1, 57 tds[days % T_CYCLES], 58 days / T_DAYS); 59 }60 61 return 0;62 }

 

转载于:https://www.cnblogs.com/yuanzone/p/5547566.html

你可能感兴趣的文章
Shell命令-文件压缩解压缩之gzip、zip
查看>>
个人总结
查看>>
uva 673 Parentheses Balance
查看>>
Bzoj 2252: [2010Beijing wc]矩阵距离 广搜
查看>>
css 禁止选中文本
查看>>
bzoj2165
查看>>
tomcat 配置首页
查看>>
算术运算表达式正则及分析
查看>>
Oracle 12c 多租户 手工创建 pdb 与 手工删除 pdb
查看>>
shell初涉
查看>>
[浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(二)
查看>>
ASP.NET 中设置路径的三种方式
查看>>
EBS使用 Distributed AD在多个节点并行adpatch
查看>>
windows添加和删除服务
查看>>
关于云栖,有点无语的几个地方,管理能不能管?
查看>>
Windows线程的同步与互斥
查看>>
C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
查看>>
AngularJs ng-change事件/指令(转)
查看>>
linux系统下安装两个或多个tomcat
查看>>
ProtoBuffer 简单例子
查看>>