一、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. iOS GPUImage 滤镜介绍

    这里直接引用官方描述: The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated ...

  2. oracle chain

    [oracle@tyger dbs]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Tue May 6 13:02 ...

  3. web前端开发-Ajax(2)

    前面的一篇博文简单的简绍了Ajax基于jQuery的用法,接下来要对Ajax做进一步的介绍,Ajax请求大致可以通过三种方式发送:原生Ajax,jQuery,伪Ajax.1.原生Ajax: 由于Aja ...

  4. 使用微软官方U盘制作软件来安装纯净版windows

    第一步:下载一个制作U启的工具;windows-usb-dvd-download-tool 微软官网:https://www.microsoft.com/en-us/download/windows- ...

  5. linux 中解压与压缩 常用操作详细讲解

    平时有时候 会在服务器进行一些文件的操作,比如安装一些服务与软件等等,都有解压操作,一般在 导出一些简单的服务器文件,也是先压缩后再导出,因此,在这里根据平时用到解压与压缩命令的频率来记录下: 1.最 ...

  6. Nodejs课堂笔记—第一课:修改Webstorm的默认主题

    最近小半年一直在忙于研究Docker源码,也在写相关的分析文章.但受限于某些条件不能发布到网上,甚为郁闷.而最近几天,接到新的开发任务,需要使用nodejs.之前一直听说过nodejs,但从来没有真正 ...

  7. androidAndroid开发学习--Ionic+Cordova 环境搭建

    我们看 Ionic 能给我们提供什么?  一个样式库,你可以使用它 来 装饰你的 HTML 网页 ,看起来 想 移动程序的 界面,什么 header .content.footer.grid.list ...

  8. pinpoint本地开发——collector

    本地启动collector 启动前准备 启动之前,要先确保本地已经可以正常package,install 必须保证install成功,才能进行后续步骤,无法install或者package参考[pin ...

  9. 让input表单输入框不记录输入过信息的方法

    有过表单设计经验的朋友肯定知道,当我们在浏览器中输入表单信息的时候,往往input文本输入框会记录下之前提交表单的信息,以后每次只要双击input文本输入框就会出现之前输入的文本,这样有时会觉得比较方 ...

  10. iOS 基本数据类型 和 指针 特点

    基本数据类型 : 整型int, 字符型char , 浮点型 (float 和 double), 枚举型; -- 构造类型 : 数组类型, 结构体类型, 共用体类型; -- 指针类型 : 最终要的数据类 ...