当前位置:软件学习 > Maya >>

POJ 1008 Maya Calendar

这道题目也是一道水题,但是好特别注意一年中的最后一天,可能会出现错误。
 
代码如下:
 
[cpp]  
#include <stdio.h>   
#include <string.h>  
#include <stdlib.h>  
  
  
int main()  
{  
    char holly[20][10] = {"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk",  
        "ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};  
    char haab[19][10] = {"pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen",  
        "yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};  
  
    int i,j;  
    int n;  
    while(scanf("%d",&n) != EOF)  
    {  
        int day,year;  
        int sum;  
        char month[7];  
        int outDayNum,outYear;  
        char *outDay;  
        int tmp;  
  
        printf("%d\n",n);//打印要输出的行数  
        for( i=0; i<n; i++)  
        {  
            scanf("%d. %s %d",&day,month,&year);  
            for ( j=0; j<18; j++)  
            {  
                if (strcmp(month,haab[j]) == 0)  
                {  
                    break;  
                }  
            }  
//------------------------------------------------  
            sum = year*365 + j*20 + day + 1;//因为是从零开始计数的  
            outYear = sum / 260;  
            sum -= outYear * 260;  
            if (sum == 0)  
            {  
                outYear --;  
                sum = 260;  
            }  
            outDayNum = (sum % 13 == 0) ? 13 : (sum % 13);  
            tmp = (sum % 20 == 0) ? 20 : sum % 20;  
            outDay = holly[tmp - 1];  
            //outDayNum = sum % 13 + 1;  
            //outDay = holly[sum % 20];  
//----------------------------------------------------  
  
            printf("%d %s %d\n",outDayNum,outDay,outYear);  
        }  
    }  
  
    return 0;  
}  
 
从这到题目延伸开来,有个点比较好玩,那就是一个进制问题。
 
来打个比方,比如20进制,数从1到20,然后进位。给你一个数101,按照平常的想法就是说,
 
高位=101/20=5;低位=101%20=1。那么这种写法应该是没问题的。
 
但是给你一个100呢?
 
也这样处理? 那么高位是5 低位是0 而我给的这种进制里面是不存在0这个数的。
 
 
其实说的正常点的就是,像上题中的循环问题,以13为周期,数字从1到13。开始的时候没注意,按照原来的方法写,导致一年中的最有一天出现的偏差。
 
活着说,如果直接写成num%13 那么就不存在13这个数了,而会多出0,所以采取了上面的写法:
 
[cpp]  
outDayNum = (sum % 13 == 0) ? 13 : (sum % 13);  
但是怎么看,怎么感觉繁琐。
 
换个方式看看,我们把最大的数先-1,再处理。
 
如上面给定的100,先减去-1就是99,再处理,那么就是 高位是4,低位是19,再将低位加1,就成了20。
 
我们这题被下面符号标记出来的
 
[cpp] 
//----------------------------------------------------  
代码可以改写成:
[cpp] 
sum = year*365 + j*20 + day ;//这里的1就不加了  
            outYear = sum / 260;  
            sum -= outYear * 260;  
            outDayNum = sum % 13 + 1;  
            outDay = holly[sum % 20];  
就完成了,或许这样的改写会简单很多。
 
那么低位进制为从2到21,同样的,数字过来先减去2再处理。
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,