从同学处翻看《程序员》2007年12月刊,有个算法擂台比较有意思,试了着写了个代码。一看要求"解答提交时间,最好能早于当月15日",今天已20。加上懒得注释。就贴上来了,好久没写文章了也是。
题目的要求:输入数字,输出相应的英文时间表达语句,当输入为0,0时结束退出
样例输入: 8 21 12 45 5 0 0 30 0 0 样例输出: it is twenty-one pass eight. it is a quarter to thirteen. it is five o' clock. it is half pass zero.
比较有意思,写了个代码试了试,结果如下:
1 0 2 30 3 15 4 45 5 12 6 53 0 15 0 23 0 56 12 48 12 0 0 0 it is one o' clock it is half pass two it is a quarter pass three it is a quarter to five it is twelve pass five it is seven to seven it is a quarter pass zero it is twenty-three pass zero it is four to one it is twelve to thirteen it is twelve o' clock
貌似符合要求,就贴上来了,算法很烂,可以说没有算法,就简单的逻辑,也没有注释,凑合着看吧,应该不难懂。
#include < stdio.h > #include < string .h > #include < stdlib.h > int initargs( int , int ); #define HALF "half" #define QUARTER "a quarter" #define NORMAL 0 #define PASS 1 #define TO 2 #define BUF 100 static int flag = 0 ; static char * hours[] = ... { " zero " , " one " , " two " , " three " , " four " , " five " , " six " , " seven " , " eight " , " nine " , " ten " , " eleven " , " twelve " , " thirteen " } ; static char * minis[] = ... { "" , " one " , " two " , " three " , " four " , " five " , " six " , " seven " , " eight " , " nine " , " ten " , " eleven " , " twelve " , " thirtenn " , " fourteen " , " a quarter " , " sixteen " , " seventeen " , " eighteen " , " nineteen " , " twenty " , " twenty-one " , " twenty-two " , " twenty-three " , " twenty-four " , " twenty-five " , " twenty-six " , " twenty-seven " , " twenty-eight " , " twenty-nine " } ; static char * hour; static char * mini; static char * mode; static char * time; struct stime ... { int hour; int mini; } ; struct stime times[BUF]; int main() ... { int count,i; int hr,mi; for (count = 0 ;count < BUF;count ++ ) ... { scanf( " %d%d " , & hr, & mi); if ((hr | mi) == 0 ) break ; if (hr < 0 || hr > 12 || mi < 0 || mi > 60 ) ... { printf( " no match " ); return 0 ; } times[count].hour = hr; times[count].mini = mi; } time = ( char * )malloc( 100 ); for (i = 0 ; i < count; i ++ ) ... { memset(time, 0 , sizeof time); initargs(times[i].hour,times[i].mini); if (NORMAL == flag) sprintf(time, " it is %s o' clock " ,hour); if (PASS == flag) sprintf(time, " it is %s pass %s " ,mini,hour); if (TO == flag) sprintf(time, " it is %s to %s " , mini, hour); printf( " %s " ,time); } return 0 ; } int initargs( int hr, int mi) ... { // int ret; switch (mi) ... { case 0 : flag = NORMAL; hour = hours[hr]; return 0 ; case 15 : flag = PASS; mini = QUARTER; hour = hours[hr]; return 0 ; case 30 : flag = PASS; mini = HALF; hour = hours[hr]; return 0 ; case 45 : flag = TO; mini = QUARTER; hour = hours[hr + 1 ]; return 0 ; default : break ; } if (mi > 0 && mi < 30 ) ... { mini = minis[mi]; hour = hours[hr]; flag = PASS; } else if (mi >= 30 && mi < 60 ) ... { mini = minis[ 60 - mi]; hour = hours[hr + 1 ]; flag = TO; } else printf(" some error " ); return 0 ; }