一、Description

上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法。这个Haab历法拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu。这些月份中的日期用0到19表示。Haab历的最后一个月叫做uayet,它只有5天,用0到4表示。玛雅人认为这个日期最少的月份是不吉利的,在这个月法庭不开庭,人们不从事交易,甚至没有人打扫屋中的地板。



因为宗教的原因,玛雅人还使用了另一个历法,在这个历法中年被称为Tzolkin(holly年),一年被分成13个不同的时期,每个时期有20天,每一天用一个数字和一个单词相组合的形式来表示。使用的数字是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, ,8 imix, 9 ik, 10 akbal ……也就是说数字和单词各自独立循环使用。



Haab历和Tzolkin历中的年都用数字0,1,……表示,数字0表示世界的开始。所以第一天被表示成:

Haab: 0. pop 0

Tzolkin: 1 imix 0

请帮助M.A. Ya教授写一个程序可以把Haab历转化成Tzolkin历。

二、问题分析

这个问题我觉得没什么大的问题,就是要注意一下小的细节以及一些特殊情况的考虑。大致上,我们要把Haab历转换为天数,再把天数转换为Tzolkin历。

  1. 怎样去除输入数字后面的点号?
  2. 怎样把输入的字母型的月份转换为数字型?
  3. 怎样计算天数差?
  4. 怎样计算输出的年数、天数字?
  5. 怎样转换天名称?

三、问题解决

  1. 在读取第一个日期的时候,要用字符串存放,然后用replace方法去除“.”,再调用Integer.parseInt(),把字符串解析为整形。



                 String s=cin.next().replace(".", "");

                 int day=Integer.parseInt(s.trim());
  2. 没什么好办法,只能用if-else语句暴力解决,逐个判断输出对应数字。注意数字是从1还是还是从0开始,这与后面的计算有关。
  3. 计算天数差时要注意由于haab历的天数用0~19表示,所以真正的天数要在输入的基础上加1.而月份如果转换的时候用1~19则月份要减1。年数从0开始,不需要变 。   int days=day+1+(month-1)*20+year*365;
  4. 计算输出的时候就要注意了,如果天数差是260的整数倍,则年数减1.而在求天数字时,如果天数是13的倍数,则天数就为13。
  5. 天名称就用年内天数与20取余,再用if--else把数字转换为字符型的表示形式。
    1. import java.util.Scanner;
    2.  
    3. public class Main {
    4. public static int changeMonths(String str){
    5. if(str.equals("pop"))
    6. return 1;
    7. else if(str.equals("no"))
    8. return 2;
    9. else if(str.equals("zip"))
    10. return 3;
    11. else if(str.equals("zotz"))
    12. return 4;
    13. else if(str.equals("tzec"))
    14. return 5;
    15. else if(str.equals("xul"))
    16. return 6;
    17. else if(str.equals("yoxkin"))
    18. return 7;
    19. else if(str.equals("mol"))
    20. return 8;
    21. else if(str.equals("chen"))
    22. return 9;
    23. else if(str.equals("yax"))
    24. return 10;
    25. else if(str.equals("zac"))
    26. return 11;
    27. else if(str.equals("ceh"))
    28. return 12;
    29. else if(str.equals("mac"))
    30. return 13;
    31. else if(str.equals("kankin"))
    32. return 14;
    33. else if(str.equals("muan"))
    34. return 15;
    35. else if(str.equals("pax"))
    36. return 16;
    37. else if(str.equals("koyab"))
    38. return 17;
    39. else if(str.equals("cumhu"))
    40. return 18;
    41. else if(str.equals("uayet"))
    42. return 19;
    43. return -1;
    44. }
    45. public static String changeDays(int i){
    46. if(i == 1){
    47. return "imix";
    48. }else if(i == 2){
    49. return "ik";
    50. }else if(i == 3){
    51. return "akbal";
    52. }else if(i == 4){
    53. return "kan";
    54. }else if(i == 5){
    55. return "chicchan";
    56. }else if(i == 6){
    57. return "cimi";
    58. }else if(i == 7){
    59. return "manik";
    60. }else if(i == 8){
    61. return "lamat";
    62. }else if(i == 9){
    63. return "muluk";
    64. }else if(i == 10){
    65. return "ok";
    66. }else if(i == 11){
    67. return "chuen";
    68. }else if(i == 12){
    69. return "eb";
    70. }else if(i == 13){
    71. return "ben";
    72. }else if(i == 14){
    73. return "ix";
    74. }else if(i == 15){
    75. return "mem";
    76. }else if(i == 16){
    77. return "cib";
    78. }else if(i == 17){
    79. return "caban";
    80. }else if(i == 18){
    81. return "eznab";
    82. }else if(i == 19){
    83. return "canac";
    84. }else {
    85. return "ahau";
    86. }
    87. }
    88. public static void main(String[] args) {
    89. Scanner cin=new Scanner(System.in);
    90. int times=cin.nextInt();
    91. System.out.println(times);
    92. for(int i=0;i<times;i++){
    93. String s=cin.next().replace(".", "");
    94. int day=Integer.parseInt(s.trim());
    95. int month=changeMonths(cin.next());
    96. int year=cin.nextInt();
    97. int days=day+1+(month-1)*20+year*365;
    98. if(days % 260==0){
    99. year=days/260-1;
    100. }else
    101. year=days/260;
    102. day=days % 260;
    103. int num;
    104. if(day % 13 ==0)
    105. num=13;
    106. else
    107. num=day % 13;
    108. int c=day%20;
    109. System.out.println(num+" "+changeDays(c)+" "+year);
    110. }
    111. }
    112. }

版权声明:本文为博主原创文章,未经博主允许不得转载。

Poj_1008--Maya Calendar的更多相关文章

  1. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

  2. POJ 1008 Maya Calendar

    链接:http://poj.org/problem?id=1008 Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  3. Maya Calendar 分类: POJ 2015-06-11 21:44 12人阅读 评论(0) 收藏

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70016   Accepted: 21547 D ...

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

    一. 题目 Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 74085   Accepted: 2 ...

  5. Poj OpenJudge 百练 Bailian 1008 Maya Calendar

    1.Link: http://poj.org/problem?id=1008 http://bailian.openjudge.cn/practice/1008/ 2.content: Maya Ca ...

  6. B - Maya Calendar(第二季水)

    Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ...

  7. POJ 1008 Maya Calendar / UVA 300【日期转换/常量数组】

    Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 82431 Accepted: 25319 Descr ...

  8. POJ1008 Maya Calendar

    题目来源:http://poj.org/problem?id=1008 题目大意: Maya人认为一年有365天,但他们有两种日历.一种叫做Haab,有19个月.前18个月每月20天,每个月的名字分别 ...

  9. [POJ 1008] Maya Calendar C++解题

        Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 62297   Accepted: 192 ...

  10. Poj Maya Calendar

    http://poj.org/problem?id=1008 Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...

随机推荐

  1. 九度OJ 1261:寻找峰值点 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:500 解决:37 题目描述: 给定一个整数序列,该整数序列存在着这几种可能:先递增后递减.先递减后递增.全递减.全递增. 请找出那个最大值的 ...

  2. 智能家居DIY-空气质量检测篇-获取空气污染指数

    前言 话说楼主终于升级当爸了,宝宝现在5个月了,宝宝出生的时候是冬天,正是魔都空气污染严重的时候,当时就想搞个自动开启空气净化器,由于种种原因一直没有时间搞,最近终于闲下来了这个事情终于提上议程了,现 ...

  3. [Oracle]根据字段值全库搜索相关数据表和字段

    这个需求比较冷门,但对于在某些特定的情况下,还是会有这样的需要的.好在Oracle实现还比较方便,用存储过程则轻松实现. 查询字符串: create or replace procedure sear ...

  4. SQL查询 [SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的区别(比较)] ---转载

    @@IDENTITY (Transact-SQL) 返回最后插入的标识值的系统函数. 备注 在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的 ...

  5. rtpdataheader.h

    #ifndef RTPDATAHEADER_H #define RTPDATAHEADER_H // For 32bit intel machines typedef short int16; typ ...

  6. python发布包流程

    1.新建文件夹suba和subb,文件夹下新建__init__.py,内容可以为空 2.suba内新建文件aa.py bb.py 3.subb内新建文件cc.py dd.py 4.setup.py文件 ...

  7. 获取android模拟器的IP地址

    http://blog.csdn.net/yjkwf/article/details/7244632 1.输入adb devices查看加载的设备 2.使用 adb -s [设备] [命令]执行命令 ...

  8. 3.11课·········异常语句与for循环重复

    异常语句try catch finally try//保护执行里面的代码段,若其中一句有错误,直接跳转到catch,不会管下面的内容 { Console.Write("请输入一个整数&quo ...

  9. Android Theme主题

    •android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式 •android:theme="@and ...

  10. 纯CSS3实现关闭按钮

    在线演示 本地下载