69,381
社区成员
发帖
与我相关
我的任务
分享
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岁就死了)#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;
}