【原创】只会生、不会死的超级牛!
【问题】最初只有1头乳牛,第2年长成1头小牛,第3年成为1头中牛,第4年长成大牛(成年牛)并生下1头乳牛。假设大牛永远不死且每年产乳牛,问:若干年(例如20年)后总共有多少头牛?
【递推法编程】
考虑用二维数组 niu[i][j]表达第i年牛的数目:
用niu[i][0]表示“乳牛”数目;
用niu[i][1]表示“小牛”数目;
用niu[i][2]表示“中牛”数目;
用niu[i][3]表示“大牛”数目。
初始条件: niu[1][0]=1(代表第1年拥有1头乳牛)
依题意,递推公式应该是这样:
niu[i+1][0] = niu[i][3]+niu[i][2](明年的乳牛数等于今年的大牛数与中牛数之和)
niu[i+1][1] = niu[i][0](明年的小牛数等于今年的乳牛数)
niu[i+1][2] = niu[i][1](明年的中牛数等于今年的小牛数)
niu[i+1][3] = niu[i][2]+niu[i][3](明年的大牛数等于今年的中牛数加上今年的大牛数)
下面是 VC6.0 C 编程:
#include <stdio.h>
int main( void )
{
static unsigned long niu[51][4];//可推算50年!
int iy,year = 20;//此处假设推算第20年的牛总数
niu[1][0] = 1; //初值
for(iy=1; iy<year; iy++)
{
niu[iy+1][0] = niu[iy][3]+niu[iy][2];//(明年的乳牛数等于今年的大牛数与中牛数之和)
niu[iy+1][1] = niu[iy][0];//(明年的小牛数等于今年的乳牛数)
niu[iy+1][2] = niu[iy][1];//(明年的中牛数等于今年的小牛数)
niu[iy+1][3] = niu[iy][2]+niu[iy][3];//(明年的大牛数等于今年的中牛数加上今年的大牛数)
}
printf("第%d年:乳牛%lu头,小牛%lu头,中牛%lu头,大牛%lu头,总共%lu头\n",year,niu[year][0],
niu[year][1],niu[year][2],niu[year][3],niu[year][0]+niu[year][1]+niu[year][2]+niu[year][3]);
return(0);
}
[ 本帖最后由 yu_hua 于 2010-10-31 12:18 编辑 ]