user-0 提问: 各位大神来解题啊，刚开始有1头母牛，4岁后每年生育1头母牛，15岁停止生育，20岁死亡，问70年后牛群有多少牛?

回复:
user: user-0
content: 引用 10 楼 ForestDB 的回复:首先，我用excel手动模拟了一下计算过程，行首是年纪，列首是年份，由此得出计算过程： 1、对每一行针对上一行长一岁； 2、4岁到14岁的牛生1岁牛（求和）；      1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  sum 1   1                                                                           1 2       1                                                                       1 3           1                                                                   1 4   1           1                                                               2 5   1   1           1                                                           3 6   1   1   1           1                                                       4 7   2   1   1   1           1                                                   6 8   3   2   1   1   1           1                                               9 9   4   3   2   1   1   1           1                                           13 10  6   4   3   2   1   1   1           1                                       19 11  9   6   4   3   2   1   1   1           1                                   28 12  13  9   6   4   3   2   1   1   1           1                               41 13  19  13  9   6   4   3   2   1   1   1           1                           60 14  28  19  13  9   6   4   3   2   1   1   1           1                       88 15  40  28  19  13  9   6   4   3   2   1   1   1           1                   128 16  59  40  28  19  13  9   6   4   3   2   1   1   1           1               187 17  87  59  40  28  19  13  9   6   4   3   2   1   1   1           1           274 18  126 87  59  40  28  19  13  9   6   4   3   2   1   1   1           1       400 19  184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1           1   584 20  270 184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1           853 21  394 270 184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1       1247 22  575 394 270 184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1   1822  由算法写出代码：  # include <stdio.h> # include <string.h>  long sum(long array[], int a, int b) {     long result = 0;     for (int i = a; i <= b; i++)         result += array[i];     return result; }  int main() {     long age[20] = { 0, 1, 0, }; // 为清晰，不使用age[0]；age[1]表示1岁，类推      for (int year = 2; year <= 70; year++) // 从第2年开始     {         memmove(&age[2], &age[1], 18 * sizeof(long)); // 1到18岁变成了2到19岁         age[1] = sum(age, 4, 14); // 4到14岁的牛生1岁牛         printf("year %d: %ld\n", year, sum(age, 1, 19)); // 牛20岁死亡     }      return 0; }   year 2: 1 year 3: 1 year 4: 2 year 5: 3 year 6: 4 year 7: 6 year 8: 9 year 9: 13 year 10: 19 year 11: 28 year 12: 41 year 13: 60 year 14: 88 year 15: 128 year 16: 187 year 17: 274 year 18: 400 year 19: 584 year 20: 853 year 21: 1247 year 22: 1822 year 23: 2662 year 24: 3890 year 25: 5684 year 26: 8305 year 27: 12135 year 28: 17731 year 29: 25908 year 30: 37856 year 31: 55313 year 32: 80821 year 33: 118093 year 34: 172553 year 35: 252127 year 36: 368398 year 37: 538289 year 38: 786526 year 39: 1149240 year 40: 1679224 year 41: 2453615 year 42: 3585124 year 43: 5238440 year 44: 7654199 year 45: 11184010 year 46: 16341629 year 47: 23877735 year 48: 34889192 year 49: 50978694 year 50: 74488031 year 51: 108838934 year 52: 159031102 year 53: 232369893 year 54: 339529603 year 55: 496107090 year 56: 724891859 year 57: 1059183022 year 58: 1547635913 year 59: 2261343762 year 60: 3304185155 year 61: 4827943333 year 62: 7054397903 year 63: 10307604364 year 64: 15061059666 year 65: 22006618635 year 66: 32155191897 year 67: 46983881670 year 68: 68650970702 year 69: 100310055509 year 70: 146569045320   补充说明： 1、这基本上是Fibonacci的变体：F(n) = F(n - a) + F(n - b) - F(n - c) - F(n - d) 根据题目中1头，4岁/15岁/20岁等几个条件，可以推出上式当中a/b/c/d的具体值； 2、算法基本是不变的，变的是对条件的理解（括号中是我代码中的理解）： 刚开始有1头母牛：这是第1年还是第0年？这头牛是1岁还是0岁？（第1年，1岁） 4岁后每年生育1头母牛：是4岁就生还是5岁生？生的小牛是1岁还是0岁？（4岁生1岁牛） 15岁停止生育：哪一岁还能生？14还是15？（14岁生，15岁就不生了） 20岁死亡：20岁活着还是死了？（19岁活着，20岁就死了）   大神！！

user: user-1
content: 首先，我用excel手动模拟了一下计算过程，行首是年纪，列首是年份，由此得出计算过程： 1、对每一行针对上一行长一岁； 2、4岁到14岁的牛生1岁牛（求和）；      1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  sum 1   1                                                                           1 2       1                                                                       1 3           1                                                                   1 4   1           1                                                               2 5   1   1           1                                                           3 6   1   1   1           1                                                       4 7   2   1   1   1           1                                                   6 8   3   2   1   1   1           1                                               9 9   4   3   2   1   1   1           1                                           13 10  6   4   3   2   1   1   1           1                                       19 11  9   6   4   3   2   1   1   1           1                                   28 12  13  9   6   4   3   2   1   1   1           1                               41 13  19  13  9   6   4   3   2   1   1   1           1                           60 14  28  19  13  9   6   4   3   2   1   1   1           1                       88 15  40  28  19  13  9   6   4   3   2   1   1   1           1                   128 16  59  40  28  19  13  9   6   4   3   2   1   1   1           1               187 17  87  59  40  28  19  13  9   6   4   3   2   1   1   1           1           274 18  126 87  59  40  28  19  13  9   6   4   3   2   1   1   1           1       400 19  184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1           1   584 20  270 184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1           853 21  394 270 184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1       1247 22  575 394 270 184 126 87  59  40  28  19  13  9   6   4   3   2   1   1   1   1822  由算法写出代码：  # include <stdio.h> # include <string.h>  long sum(long array[], int a, int b) {     long result = 0;     for (int i = a; i <= b; i++)         result += array[i];     return result; }  int main() {     long age[20] = { 0, 1, 0, }; // 为清晰，不使用age[0]；age[1]表示1岁，类推      for (int year = 2; year <= 70; year++) // 从第2年开始     {         memmove(&age[2], &age[1], 18 * sizeof(long)); // 1到18岁变成了2到19岁         age[1] = sum(age, 4, 14); // 4到14岁的牛生1岁牛         printf("year %d: %ld\n", year, sum(age, 1, 19)); // 牛20岁死亡     }      return 0; }   year 2: 1 year 3: 1 year 4: 2 year 5: 3 year 6: 4 year 7: 6 year 8: 9 year 9: 13 year 10: 19 year 11: 28 year 12: 41 year 13: 60 year 14: 88 year 15: 128 year 16: 187 year 17: 274 year 18: 400 year 19: 584 year 20: 853 year 21: 1247 year 22: 1822 year 23: 2662 year 24: 3890 year 25: 5684 year 26: 8305 year 27: 12135 year 28: 17731 year 29: 25908 year 30: 37856 year 31: 55313 year 32: 80821 year 33: 118093 year 34: 172553 year 35: 252127 year 36: 368398 year 37: 538289 year 38: 786526 year 39: 1149240 year 40: 1679224 year 41: 2453615 year 42: 3585124 year 43: 5238440 year 44: 7654199 year 45: 11184010 year 46: 16341629 year 47: 23877735 year 48: 34889192 year 49: 50978694 year 50: 74488031 year 51: 108838934 year 52: 159031102 year 53: 232369893 year 54: 339529603 year 55: 496107090 year 56: 724891859 year 57: 1059183022 year 58: 1547635913 year 59: 2261343762 year 60: 3304185155 year 61: 4827943333 year 62: 7054397903 year 63: 10307604364 year 64: 15061059666 year 65: 22006618635 year 66: 32155191897 year 67: 46983881670 year 68: 68650970702 year 69: 100310055509 year 70: 146569045320   补充说明： 1、这基本上是Fibonacci的变体：F(n) = F(n - a) + F(n - b) - F(n - c) - F(n - d) 根据题目中1头，4岁/15岁/20岁等几个条件，可以推出上式当中a/b/c/d的具体值； 2、算法基本是不变的，变的是对条件的理解（括号中是我代码中的理解）： 刚开始有1头母牛：这是第1年还是第0年？这头牛是1岁还是0岁？（第1年，1岁） 4岁后每年生育1头母牛：是4岁就生还是5岁生？生的小牛是1岁还是0岁？（4岁生1岁牛） 15岁停止生育：哪一岁还能生？14还是15？（14岁生，15岁就不生了） 20岁死亡：20岁活着还是死了？（19岁活着，20岁就死了）

user: user-2
content: 我算了一下  好像 int 溢出了   http://www.oschina.net/question/193385_29597

user: user-3
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-4
content: 引用 2 楼 yyxgs 的回复:上面不对，是4年后每年都生，看错了！     如果第4年是2头的话，第7年应该是6头吧

user: user-5
content: 年数y,当年头数a[y] 当年保有数量 num=a[y]; 当年育龄数  canborn =y<4?0 : a[y-4];// 4年前的头数 当年不可生育数 cannnotborn =y<15?0:a[y-15];//15年前头数 当年死亡数 dead=y<20:0?a[y-20];//20年前头数 当年出生数 born = canborn -cannotborn;//到达育龄数减去绝育数 当年保有数 a[y] =a[y-1] +born -dead; 去年头数，加上新生数，减去死亡数 4,15,20 如果需要斟酌，可以修改成 3，14，19

user: user-0
content: 引用 7 楼 nanjun520 的回复: 我算了一下  好像 int 溢出了   http://www.oschina.net/question/193385_29597  哈哈，那就用双长

user: user-6
content: 建一个长度为20的数组，分别存储0~19岁的活牛，每过1年4~14岁牛的总数为新生牛数  #include<stdio.h>  int main() { 	int herd[20] = {1,0,0};			//牛群 	int total = 1;					//总牛数 	int born;						//新生牛 	int i,j;  	for(i=1;i<=70;i++){ 		//显示当前各年龄的牛数 		printf("第%02d年: %d头",i,total); 		for(j=0;j<20;j++) 			printf("%c%d",j?'\t':'\n',herd[j]); 		printf("\n");  		total = born = 0; 		for(j=19;j>=0;j--){ 			total += herd[j];		//0~19岁牛仍在，包含在总数中 			if(j>=4 && j < 15) 				born += herd[j];	//4~14岁牛生小牛 			herd[j+1] = herd[j];	//每头牛均长1岁 		} 		herd[0] = born; 		total += born; 	} 	return 0; }   这里题目存在很多岐义： 刚开始有1头母牛，开始的一头牛几岁？0/1 4岁后每年生育1头母牛，从几岁开始生？4/5 15岁停止生育，生到几岁？14/15 20岁死亡活到多少岁？19/20

user: user-7
content: 写了一个效率也不高，不过算的结果是2628607715，不保证正确

user: user-0
content: 上面不对，是4年后每年都生，看错了！

user: user-0