| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1071 人关注过本帖
标题:Fibonacci数列相关问题
只看楼主 加入收藏
Aamir
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:18
专家分:30
注 册:2011-2-23
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
Fibonacci数列相关问题
题目:编程实现以下功能:从键盘输入一个正整数n,若n小于10或大于20,则提示用户重新输入,直到符合条件为止;将Fibonacci(菲波那契)数列的前n个合数(即除1以外的非素数)输出显示在屏幕上。
例: 输入33,提示用户重新输入。
输入11,显示结果为:
8        21        34        55
144        377        610        987
2584        4181        6765


我编写的代码:
#include<stdio.h>

int Fib(int n)
{
    int f;
    if(n==1)
        f=1;
    else if(n==2)
        f=1;   
    else f=Fib(n-1)+Fib(n-2);
    return(f);

}

int com_num(int n)
{
    int k,tof;
    for(k=2;k<Fib(n);k++)
    {
        if(Fib(n)%k==0)
            tof=1;break;   
    }
    return(tof);
}
  
void main()
{
    int tr,tot,num,i;
    num=0;
    printf("Please input a number between ten and twenty.\n");
    do
    {
        scanf("%d",&tr);
        if(tr<10||tr>20)
        printf("Error.Please input a number between ten and twenty.\n");
    }
    while(tr<10||tr>20);
    tot=tr;
    for(i=3;num<tot;i++)
    {
        if(com_num(i)==1)
        {
            printf("%d ",Fib(i));
            num=num+1;
        }
    }
    printf("\n");
}


运行11的结果是:
8 34 144 610 2584 46368 196418 832040 3524578 14930352
结果不对啊。我看了好几遍,都没看出来哪里出了问题,麻烦大家看看。谢谢。
搜索更多相关主题的帖子: 正整数 用户 
2011-03-30 17:40
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:10 
程序代码:
#include<stdio.h>

int Fib(int n)
{
    int f;
    if(n==1)
        f=1;
    else if(n==2)
        f=1;   
    else f=Fib(n-1)+Fib(n-2);
    return(f);

}

int com_num(int n)
{
    int k,tof=0;    //这个地方应该赋初值
    for(k=2;k<Fib(n);k++)
    {
        if(Fib(n)%k==0)
          {  tof=1;break;}    //这个地方应该为一条语句
    }
    return(tof);
}

 
void main()
{
    int tr,tot,num,i;
    num=0;
    printf("Please input a number between ten and twenty.\n");
    do
    {
        scanf("%d",&tr);
        if(tr<10||tr>20)
        printf("Error.Please input a number between ten and twenty.\n");
    }
    while(tr<10||tr>20);
    tot=tr;
    for(i=3;num<tot;i++)
    {
        if(com_num(i)==1)
        {
            printf("%d ",Fib(i));
            num=num+1;
        }
    }
    printf("\n");
}


编程的道路上何其孤独!
2011-03-30 17:55
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
不过要说下你的程序效率太低了,大量的重复计算,如果你是新手,练习编写程序 的话,就当我没说。

编程的道路上何其孤独!
2011-03-30 17:57
Aamir
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:18
专家分:30
注 册:2011-2-23
收藏
得分:0 
回复 2楼 outsider_scu
那个for语句中不是已经赋初值了吗?为什么还要赋初值呢?我的确的新手,有什么更简单的办法吗?谢谢。
2011-03-30 18:06
Aamir
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:18
专家分:30
注 册:2011-2-23
收藏
得分:0 
回复 2楼 outsider_scu
看懂了,好的,谢谢。非常感谢。那还有什么简单的方法吗?
2011-03-30 18:10
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
int com_num(int n)
{
    int k,tof=0;    //这个地方应该赋初值
    for(k=2;k<Fib(n);k++)
    {
        if(Fib(n)%k==0)
          {  tof=1;break;}    //这个地方应该为一条语句
    }
    return(tof);
}
你是靠TOF的值来判断那个数是不是合数的,如果这个数不是合数呢?就会因为TOF没有赋初值返回一个随机值,这个随机值很可能是非零值。。

编程的道路上何其孤独!
2011-03-30 18:12
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
可以用一种被叫作动态规划的算法来处理大量重复计算的问题。
定义一个数组F
F[0] = 1;
F[1] = 1;
for(i=2;i<n;i++)
   F[i] = F[i-1] + F[i-2];
这样的好处是不用重复计算。

编程的道路上何其孤独!
2011-03-30 18:20
Aamir
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:18
专家分:30
注 册:2011-2-23
收藏
得分:0 
回复 7楼 outsider_scu
好的,谢谢。
2011-03-30 18:26
jianghu1958
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-1-7
收藏
得分:0 
给力
2011-03-31 00:06
快速回复:Fibonacci数列相关问题
数据加载中...
 
   



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

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