/*
* poj_1008.c
* accepted
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HABB_MONTHS (19)
#define HABB_M_DAYS (20)
#define HABB_19M_DAYS (5)
#define HABB_DAYS (365)
#define TZOLKIN_DAY_NAMES (20)
#define TZOLKIN_PERIODS (13)
#define TZOLKIN_DAYS (260)
static void poj_1008 ();
int main (int argc, char * argv[]){
poj_1008 ();
return 0;
}
static void poj_1008 (){
int i, j, lines;
int days, in_day, in_month, in_year, out_year;
char in_no_of_day[4], in_name_of_month[8], out_line_str[20];
char * out_str, * p;
char habb_months[][8] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"};
char tzolkin_day_names[][9] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"};
scanf ("%d", &lines);
out_str = (char *)malloc (sizeof(char) * 20 * lines + 20); // each line does not exceed 20 characters.
sprintf (out_line_str, "%d\n", lines);
strcpy (out_str, out_line_str);
for (i=0; i<lines; i++){
scanf ("%s%s%d", in_no_of_day, in_name_of_month, &in_year);
for (p=in_no_of_day; '.'!= (*p); p++){
;
}
*p = '\0';
in_day = atoi (in_no_of_day);
for (j=0; j<HABB_MONTHS; j++){
if (!strcmp (habb_months[j], in_name_of_month)){
in_month = j;
break;
}
}
days = (in_year * HABB_DAYS) + (in_month * HABB_M_DAYS) + (in_day);
out_year = days / TZOLKIN_DAYS;
days = days - out_year * TZOLKIN_DAYS;
sprintf (out_line_str, "%d %s %d\n", (days % TZOLKIN_PERIODS + 1), tzolkin_day_names[days % TZOLKIN_DAY_NAMES], out_year);
strcat (out_str, out_line_str);
}
fprintf (stdout, "%s", out_str);
if (out_str){
free (out_str);
}
}
参考了http://www.slyar.com/blog/poj-1008-c.html,觉得别人写的scanf还是比较好,另外,我的输出都整合到了一起,从别人的程序对比可以看出,对于这种有输入规模限制的题目,其实POJ的检测是等到所有输入都已经结束之后再校验结果的。
该题是一开始就输入问题规模,有些则是输入某一组特殊的符号作为输出结束符,某些题目则是没有结束符,循环等待可能的输入。由此看来,不比多考虑是不是需要一齐输出还是分开输出。