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

yyxgs 2016-08-31 08:58:30
我算的是7242176头,不知道对不对,算法非常低效率,就不贴代码了,各位大神,求验证啊!
...全文
607 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyxgs 2016-09-03
  • 打赏
  • 举报
回复
引用 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岁就死了)
大神!!
ForestDB 2016-09-03
  • 打赏
  • 举报
回复
首先,我用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岁就死了)
nanjun520 2016-09-02
  • 打赏
  • 举报
回复
我算了一下 好像 int 溢出了 http://www.oschina.net/question/193385_29597
赵4老师 2016-09-02
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
iretf 2016-09-02
  • 打赏
  • 举报
回复
引用 2 楼 yyxgs 的回复:
上面不对,是4年后每年都生,看错了!
如果第4年是2头的话,第7年应该是6头吧
lm_whales 2016-09-02
  • 打赏
  • 举报
回复
年数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
yyxgs 2016-09-02
  • 打赏
  • 举报
回复
引用 7 楼 nanjun520 的回复:
我算了一下 好像 int 溢出了 http://www.oschina.net/question/193385_29597
哈哈,那就用双长
caojinrong 2016-09-01
  • 打赏
  • 举报
回复
建一个长度为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

paschen 2016-09-01
  • 打赏
  • 举报
回复
写了一个效率也不高,不过算的结果是2628607715,不保证正确
yyxgs 2016-08-31
  • 打赏
  • 举报
回复
上面不对,是4年后每年都生,看错了!


yyxgs 2016-08-31
  • 打赏
  • 举报
回复

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧