一、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把数字转换为字符型的表示形式。
    import java.util.Scanner;
    
    public class Main {
    public static int changeMonths(String str){
    if(str.equals("pop"))
    return 1;
    else if(str.equals("no"))
    return 2;
    else if(str.equals("zip"))
    return 3;
    else if(str.equals("zotz"))
    return 4;
    else if(str.equals("tzec"))
    return 5;
    else if(str.equals("xul"))
    return 6;
    else if(str.equals("yoxkin"))
    return 7;
    else if(str.equals("mol"))
    return 8;
    else if(str.equals("chen"))
    return 9;
    else if(str.equals("yax"))
    return 10;
    else if(str.equals("zac"))
    return 11;
    else if(str.equals("ceh"))
    return 12;
    else if(str.equals("mac"))
    return 13;
    else if(str.equals("kankin"))
    return 14;
    else if(str.equals("muan"))
    return 15;
    else if(str.equals("pax"))
    return 16;
    else if(str.equals("koyab"))
    return 17;
    else if(str.equals("cumhu"))
    return 18;
    else if(str.equals("uayet"))
    return 19;
    return -1;
    }
    public static String changeDays(int i){
    if(i == 1){
    return "imix";
    }else if(i == 2){
    return "ik";
    }else if(i == 3){
    return "akbal";
    }else if(i == 4){
    return "kan";
    }else if(i == 5){
    return "chicchan";
    }else if(i == 6){
    return "cimi";
    }else if(i == 7){
    return "manik";
    }else if(i == 8){
    return "lamat";
    }else if(i == 9){
    return "muluk";
    }else if(i == 10){
    return "ok";
    }else if(i == 11){
    return "chuen";
    }else if(i == 12){
    return "eb";
    }else if(i == 13){
    return "ben";
    }else if(i == 14){
    return "ix";
    }else if(i == 15){
    return "mem";
    }else if(i == 16){
    return "cib";
    }else if(i == 17){
    return "caban";
    }else if(i == 18){
    return "eznab";
    }else if(i == 19){
    return "canac";
    }else {
    return "ahau";
    }
    }
    public static void main(String[] args) {
    Scanner cin=new Scanner(System.in);
    int times=cin.nextInt();
    System.out.println(times);
    for(int i=0;i<times;i++){
    String s=cin.next().replace(".", "");
    int day=Integer.parseInt(s.trim());
    int month=changeMonths(cin.next());
    int year=cin.nextInt();
    int days=day+1+(month-1)*20+year*365;
    if(days % 260==0){
    year=days/260-1;
    }else
    year=days/260;
    day=days % 260;
    int num;
    if(day % 13 ==0)
    num=13;
    else
    num=day % 13;
    int c=day%20;
    System.out.println(num+" "+changeDays(c)+" "+year);
    }
    }
    }

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

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. Js版json解析

    JsonDecoder={ pos:0, isDigit:function(ch){ return ( ch >= '0' && ch <= '9' )||( ch == ...

  2. 如何将gedit变成c++编译器

    本蒟蒻的第一篇文章,分享一下神佬教我的好东西 ——将Ubuntu 16.04上gedit变为编译器! 1° 新建文档.然后点击编辑,打开首选项. 2° 勾选外部工具,然后退出.打开工具,选择Manag ...

  3. 我的Android进阶之旅------>Android中StateListDrawable支持的状态

    Android中StateListDrawable支持的状态 android:state_active 代表是否处于激活状态 android:state_checked  代表是否处于已勾选状态 an ...

  4. ggplot2绘图系统

    ggplot2包实现了一个在R中基于全面一致的语法创建图形时的系统 .在ggplot2中,图是采用串联起来(+)号函数创建的.详细内容参见<ggplot2:数据分析与图形艺术>,这里只简要 ...

  5. sql获取数组长度

    需求:获取字符串数组1,2,3,4的长度,当然也可以是其他分隔符1|2|3等 方法:通过自定义函数来实现 /* 获取字符串数组长度 */ from sysobjects where id = obje ...

  6. LeetCode:存在重复元素【217】

    LeetCode:存在重复元素[217] 题目描述 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 ...

  7. 教你如何写一个 Yii2 扩展

    前言 把一系列相关联的功能使用模块开发,好处多多,维护起来很方便,模块还可以单独发布出去,让下一个项目之间使用,真是方便. 下面我就写一个开发扩展的简单教程. Gii gii 自带帮助我们生成一个基本 ...

  8. PAT 天梯赛 L2-003. 月饼 【贪心】

    题目链接 https://www.patest.cn/contests/gplt/L2-003 思路 用贪心思路 最后注意一下 总售价有可能是浮点数 AC代码 #include <cstdio& ...

  9. .vimrc .bashrc

    怕丢了,赶快保存! .bashrc # switch caps lock with escxmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'sudo ...

  10. 【leetcode刷题笔记】Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...