外观数列(Look-and-say sequence)
外观数列是一个有趣的数列。它以数字1开始,序列的第n+1项是对第n项的描述。比如第2项是2个1,所以下一项(第三项)就是21。又比如第5项是111221,描述就是3个1,2个2,1个1, 所以下一项就是312211。
这个程序打印输出Look-and-say数列的前18项。
C语言程序如下:
#include <stdio.h>
#include <memory.h>
#define MAXN 100000 //数组最大值
#define M 18 //输出到第几个数
char s[MAXN+1], t[MAXN+1];
char *ps, *pt;
int _tmain(int argc, _TCHAR* argv[])
{
char look;//看的是哪个
int say;//说第几个
memset(s, 0, sizeof(s));//作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
memset(t, 0, sizeof(t));
s[0] = '1';//第一个是1
printf("%s\n", s);//s是要输出的结果,输出第一个数
ps = s;
pt = t;
for(int i=1; i<M; i++) {//执行M-1次循环体
look = *ps; //先看ps的第一个
say = 1; //第一次出现,即出现一次
while(*(++ps)) { //ps逐个往后移动.完成一次识别并生成,识别ps的样子,生成的内容放到pt
if(*ps == look) //如果ps指的东西等于look
say++; //个数加一
else { //否则,一个段描述完了,该写入pt中了
*pt++ = '0' + say;//pt的下一个的值是几次 连着下一句一起说明几个几
*pt++ = look; //pt的下一个的值是看见的
look = *ps; //让look的值为看见的下一个
say = 1; //定义为1次
}
}
//收尾工作,最后一个放到pt中
*pt++ = '0' + say;
*pt++ = look;
if(i & 1) { //i为奇数的时候执行此句
ps = t;
pt = s;
} else { //i为偶数的时候执行此句
ps = s;
pt = t;
}
printf("%s\n", ps);//s是要输出的结果
}
return 0;
}
最后,感谢林福平老师的指导。