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++ ,