Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 9475 | Accepted: 5773 |
Description
Input
Output
Sample Input
3 122344111 1111111111 12345
Sample Output
1122132431 101 1112131415
Source
Regionals 2007 >> North
America - Rocky Mountain
问题链接:POJ3438 ZOJ2886 UVALive3822 Look and Say。
问题简述:(略)
问题分析:这个问题是首先输入测试例子数量t,然后输入t行数字串,将每一行的数字串转换为Look and Say数字串输出。
程序说明:
这里给出两个程序,一个是将字符串读入到字符数组中,然后进行将数字串转换为Look and Say数字串的处理;另外一个程序是一边读入字符串,一边处理,省去缓冲存储。
使用getchar()函数直接处理输入流的话,不使用多余的缓存,是一个好主意。
参考链接:I00031 Look-and-say sequence。
AC通过的C语言程序(正解)如下:
/* POJ3438 ZOJ2886 Look and Say */ #include <stdio.h> #define MAXN 1024 char r[MAXN * 2]; int main(void) { int t, say; char look, c, *pt, temp[10], *pt2; scanf("%d", &t); getchar(); while(t--) { // Look and Say转换:一边读入一边转换 pt = r; look = getchar(); // 读入首字符 say = 1; while((c = getchar()) != '\n') { if(c == look) say++; else { sprintf(temp, "%d", say); pt2 = temp; while(*pt2) *pt++ = *pt2++; *pt++ = look; look = c; say = 1; } } sprintf(temp, "%d", say); pt2 = temp; while(*pt2) *pt++ = *pt2++; *pt++ = look; *pt = '\0'; // 输出结果 printf("%s\n", r); } return 0; }
另外一个AC通过的C语言程序如下:
/* POJ3438 ZOJ2886 Look and Say */ #include <stdio.h> #define MAXN 1024 char s[MAXN]; char r[MAXN * 2]; int main(void) { int t, say; char look, *ps, *pt, temp[10], *pt2; scanf("%d", &t); while(t--) { // 读入字符串 scanf("%s", s); // Look and Say转换 ps = s; pt = r; look = *ps; say = 1; while(*(++ps)) { if(*ps == look) say++; else { sprintf(temp, "%d", say); pt2 = temp; while(*pt2) *pt++ = *pt2++; *pt++ = look; look = *ps; say = 1; } } sprintf(temp, "%d", say); pt2 = temp; while(*pt2) *pt++ = *pt2++; *pt++ = look; *pt = '\0'; // 输出结果 printf("%s\n", r); } return 0; }