标题:k阶斐波那契数列
只看楼主
康明贤
Rank: 2
来 自:NWPU
等 级:论坛游民
帖 子:46
专家分:32
注 册:2017-10-23
结帖率:75%
已结贴  问题点数:20 回复次数:4 
k阶斐波那契数列
试利用循环队列编写k阶斐波那契数列中前n+1项 (f(0),f(1),…,f(n))的程序,要求满足: f(n)<=max而f(n+1)>max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在程序执行结束时,留在循环队列中的元素应是所求k阶斐波那契序列中的最后k项 f(n-k+1),…,f(n))。
Input

输入常数max(0<max<10000),阶数k(1<k<100),用空格隔开。
Output

输出k阶斐波那契数列中的最后k项f(n-k+1),…,f(n)。

C语言
搜索更多相关主题的帖子: 斐波那契 数列 循环 队列 max 
2018-05-10 15:59
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:20 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define  enoughsize 100  
typedef struct 
{
    int *base;     
    int front;      
    int rear;     
}
SqQueue;

 int AddSum(int n,int *q)

 {
    int sum=0;
    int i;
    for(i=0;i<n;i++)  sum+=q[i];
    return sum;

 }

int main()
{
    SqQueue Q;
    int k,max,i,n,*store;
    printf("请输入斐波那奇的阶数:");
    scanf("%d",&k);
    printf("请输入序列中允许的最大数:");
    scanf("%d",&max);
    Q.base=(int*)malloc(k*sizeof(int));
    store=(int*)malloc(enoughsize*sizeof(int));
    if((!Q.base)||(!store))
       {
        printf("Error!");
        return 0;
       }
    for(i=0;i<k;i++)
       {
        store[i]=0;
        Q.base[i]=0;
       }
    store[k-1]=1;
    Q.base[k-1]=1;   
    store[k]=AddSum(k,Q.base);
    Q.front=0;
    Q.rear=k-1;
    n=k;
    while(store[n]<=max)
       {
        Q.rear=(Q.rear+1)%k;
        Q.base[Q.rear]=store[n];
        n++;
        store[n]=AddSum(k,Q.base);
       }
    printf("斐波那契数列:\n");
    for(i=0;i<n;i++)  printf("%d%c",store[i],' ');
    printf("\n");
} 
2018-05-10 17:40
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 2楼 自学的数学
话说AddSum函数那里求和不是可以用原来sum的值加上rear的值再减去front的值么,实际上就是rear*2-front
满循环队列front的值等于非0的rear的值-1,如果是0那就是size-1,因为队列初始化已经满,那么只要知道size的值和rear的值就可以知道rear的值了~

[此贴子已经被作者于2018-5-10 19:14编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-10 19:11
康明贤
Rank: 2
来 自:NWPU
等 级:论坛游民
帖 子:46
专家分:32
注 册:2017-10-23
得分:0 
回复 2楼 自学的数学
万分感谢。 #include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int *data;
    int front;
    int real;
    int k;
}queue;

void create(queue *s,int n,int m)
{
    int sum,i;
    s->data=(int *)malloc(n*sizeof(int));
    s->k=n;
    s->front=0;
    s->real=s->front;
    for(i=0;i<n-1;i++)
        s->data[s->real++]=0;
    s->data[s->real]=1;
    while(1)
    {
        s->real++;
        if((s->real)%s->k==s->front)
            s->real=s->front;
        sum=0;
        for(i=0;i<n;i++)
            sum+=s->data[i];
            if(sum>m)
                break;
            else
                s->data[s->real]=sum;
    }
    for(i=0;i<n;i++)
    {
        if((s->real)%s->k==s->front)
            s->real=s->front;
        printf("%d ",s->data[s->real++]);
    }
}

int main()
{
    queue *s;
    int n,m;
    s=(queue *)malloc(sizeof(queue));
    scanf("%d %d",&m,&n);
    create(s,n,m);
    return 0;
}这是我同学写的,可以看看。

千里之行,始于足下。
2018-05-11 19:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
这个是从某个博客上copy下来的~

原出处在
https://blog.

循环队列改改就可以了,至于求和看到可以用rear=2*rear-front~

程序代码:
#include <stdio.h>
#define MAX 1000    //定义数列最大项

//递归实现
int Fb1(int k, int m)
{
    if(m<k) return 0;
    else if((m==k)||(m==k+1)) return 1;
    else return 2*Fb1(k,m-1)-Fb1(k,m-k-1);
}

//循环实现
int Fb2(int k, int m)
{
    int Fn[MAX],i;
    for(i = 0; i < MAX; i++)
    {
        if(i < k - 1)
        {
            Fn[i] = 0;//前k-1项为0
            continue;
        }
        if(i == k - 1 || i == k) //k和k+1项为1
        {
            Fn[i] = 1;
            continue;
        }
        Fn[i] = 2 * Fn[i-1] - Fn[i-k-1];
    }

    return Fn[m-1];
}

int main()
{
    int k,m,result,i;
    scanf("%d%d",&k,&m);
    printf("递归实现: %d ",Fb1(k,m));
    printf("循环实现: %d\n",Fb2(k,m));
    return 0;
}


[此贴子已经被作者于2018-5-11 20:31编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-11 20:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486817-1-1.html




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

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