数据结构1.17题:求K阶Fibonacci数第m项

来源:互联网 发布:mysql update if语句 编辑:程序博客网 时间:2024/05/24 07:18

/*
  数据结构1.17题:求K阶Fibonacci数第m项
  作者:shizhixin
  Email:szhixin@gmail.com
  Blog:http://blog.csdn.net/ShiZhixin
*/

#include "stdafx.h"

//计算pf地址后k个数之和
int Sum(int* pf,int k)
{
    int i;
    int sum=0;
    for (i=0;i<k;i++)
    {
        sum+=*pf;
        pf++;
    }
    return sum;
}

//对pf的前k-1项前移一个数
void Movef(int* pf,int k)
{
    int i;
    int* q=pf;
    pf++;
    for (i=0;i<k-1;i++)
    {
        *q=*pf;
        q++;
        pf++;
    }
}

/*输入参数k:阶数  m:第m项 从0开始,比如:
k=2;
数列为0 1 1 2 3 5 ...
其中0为第0项,5为第5项*/
int KFibonacci(int k,int m)
{
    if (m<0||k<2)
    {
        return -1;
    }
    int* f=new int[k];
    int i;
    for (i=0;i<k-1;i++)  //前0- k-2项赋0
    {
        f[i]=0;
    }
    f[k-1]=1;            //k-1项赋1
    int KFib;  //存放第m项值
    if (m<k)   //m<k,不用求和移动,直接释放内存并返回
    {
        KFib=f[m];
        delete[] f;
        return KFib;
    }
    for (i=k;i<=m;i++)  //m>k
    {
        int sum=Sum(f,k);
        Movef(f,k);
        f[k-1]=sum;
    }
    KFib=f[k-1];
    delete[] f;
    return KFib;
}

int main(int argc, char* argv[])
{
    int k,m;
    scanf("%d%d",&k,&m);
    printf("%d",KFibonacci(k,m));
    return 0;
}

原创粉丝点击