| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 691 人关注过本帖
标题:一个古代的问题,不过学c语言不久所以没能够写出来,还请高手指点
只看楼主 加入收藏
因为曾今年少
Rank: 2
等 级:论坛游民
帖 子:131
专家分:62
注 册:2011-4-13
结帖率:92.31%
收藏
已结贴  问题点数:20 回复次数:10 
一个古代的问题,不过学c语言不久所以没能够写出来,还请高手指点
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月    后每个月又生一对兔子,假如兔子都不死,问一年后的兔子总数为多少?
程序代码:
main()
{
  int i;
  long t1,t2;
  t1=t2=1;
   for (i=1;i<=20;i++)
   {
     if (i%2==0)
     {    
     t1+=1;
     t2+=1;
     }
     if(i%3==0)
     {
     t1*=2;
     t2*=2;
     }
printf("%ld\n",t1+t2);
   }

}
这个程序也不知道哪里出问题请高手们给个简洁易懂的程序
如果可以的话
帮我改一下不甚感激
搜索更多相关主题的帖子: 问题 小兔子 
2011-04-17 21:07
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:3 
这个问题挺有意思,分析题意可得以下信息:
    1. 三个月后,每个月都会有小兔子出生。
    2. 出生的小兔子的数量与可以进行繁殖的兔子数量相等。
    3. 年龄不小于 3 个月的兔子可以进行繁殖。啊,理解错了,应该是不小于 2 个月

所以对我们来说最重要的是要知道所有兔子的年龄。要做到这一点我们只需记录每个月出生的兔子数量就行了。
由此得以下算法:
程序代码:
#include <stdio.h>

int main() {
    int rbm[12] = {0}, rt = 2, m, i;    //rbm : rabbits born monthly, rt: rabbit total, m: month
    rbm[1] = 2;
    for (m = 4; m <= 12; m++) {
        for (i = 1; i <= m - 2; i++) {
            rbm[m] += rbm[i];
        }
        rt += rbm[m];
    }
    printf("There would be %d rabbits after 1 year.", rt);
    return 0;
}


楼下的同学理解正确,佩服

[ 本帖最后由 voidx 于 2011-4-17 22:01 编辑 ]
2011-04-17 21:32
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:3 
这是著名的Fibonacci数列:-- 谭浩强书上的例子
fn=     1                   n=1,2
        fn-1+fn-2           n≥3
背景故事:
农场里有一对兔子,
1) 从出生后第3个月起每个月都生一对小兔子(包括出生的这个月) ,
2) 而生出的每一对小兔子,也是从出生后第3个月起,每个月都生一对小兔子,(所有兔子永远不死)     则:每月的兔子数,为一个Fibonacci数列。
分析:
1) 上个月原有的兔子数: fn-1对。
2) 其中上上个月已有的兔子( fn-2对),
   上上个月已有的兔子本月已成为老兔子,每对生出一对。
   即,这个月的新生兔子数为fn-2对!!!
3)从而,上个月原有的兔子数:(fn-1对)加上 这个月的新生兔子数(fn-2对),为本月的兔子总数。即:fn = fn-1 + fn-2
程序代码:
#include <stdio.h>
void main()
{
    long f1,f2;  
    int i;

    f1 = f2 = 1; //首先给出序列的前两项:f1,f2
    for( i = 1;i <= 20; i++)
    {   
       printf("%12ld %12ld",f1,f2);//每次输出2个数据
       if(i%2==0) printf("\n");  //一行输出4个数据
       f1=f1+f2;    //计算下两项,仍放到f1和f2中
         f2=f2+f1;
     }
}



2011-04-17 21:42
PぴㄒLaㄨMa
Rank: 1
等 级:新手上路
帖 子:18
专家分:5
注 册:2011-1-16
收藏
得分:3 
= =|||    Fibonacci 数列~~    循环举例中有~   比较看看吧~!
2011-04-17 21:42
水晰
Rank: 3Rank: 3
来 自:新疆
等 级:论坛游侠
帖 子:39
专家分:113
注 册:2011-4-6
收藏
得分:3 
程序代码:
#include <stdio.h>
void main()
{
    int f1=1,f2=1,i;
    for(i=1;i<6;i++)
    {
       
        f1=f1+f2;
        f2=f1+f2;
    }
    printf("%d\n",f2*2);
}
2011-04-17 22:17
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:3 
我的书里也有这个例子

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-17 22:53
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
回复 2楼 voidx
呵呵。这不是理解问题,这确实是名题。
知道的人在不思考的情况下就能写出答案,毕竟它很基础。前阵子 C++ 里有个人问的稍复杂一些的数列问题就要用到这种基础的数列。

找到了那个帖子。和这个有点像,有兴趣的可以去参考一下~
https://bbs.bccn.net/viewthread.php?tid=334727


[ 本帖最后由 pangding 于 2011-4-18 00:07 编辑 ]
2011-04-17 23:59
因为曾今年少
Rank: 2
等 级:论坛游民
帖 子:131
专家分:62
注 册:2011-4-13
收藏
得分:0 
各位大虾
在此衷心感谢各位的指点
呵呵
2011-04-18 07:34
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:3 
#include <stdio.h>

int f(int n)
{
    if(n == 1 || n == 2)
        return 1;
    esle
        return f(n - 1) + f(n -2);
}

int main(void)
{
    printf("%d\n", f(12));
    return 0;
}

勤能补拙,熟能生巧!
2011-04-18 07:42
死不了的恨
Rank: 2
来 自:淮北
等 级:论坛游民
帖 子:16
专家分:54
注 册:2011-4-11
收藏
得分:3 
#include<stdio.h>
void main()
{
    int f1,f2;
    int i,sum;
    f1=f2=1;
    sum=f1;
    for(i=1;i<6;i++)
    {
        f1=f1+f2;
        f2=f1+f2;
    }
    printf("兔子的总数是:%ld\n",f2);
}

天行鉴,君子以自强不息。
2011-04-18 08:33
快速回复:一个古代的问题,不过学c语言不久所以没能够写出来,还请高手指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019116 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved