“大整数阶乖”问题的递推算法

/*
    标题:<<系统设计师>>应试编程实例-[递推算法程序设计]
    作者:成晓旭
    时间:2002年09月11日(11:52:00-16:26:00)
          实现递推算法的大整数阶乖处理函数
    时间:2002年09月16日(18:38:00-20:02:00)
          实现“斐波那契数列”问题的递推算法函数
*/
#include    "stdio.h"
#include    "stdlib.h"

//:============================“大整数阶乖”问题的递推算法===========================
#define        MAXN    1000        //最大数据位数
//用递推法求取整数k的阶乖,将结果放入数组array中
void    pnext(int    array[],int k)
{
    int    *temp;    //动态数组[临时存储运算大整数]
    int    i,j,num_len = array[0],carry,t;    //循环变量,长整数位数,进位标志,临时变量
    if(array[0] >= MAXN)
    {
        printf("数据处理位数超过程序设计上限,程序将自动中断运行! ");
        exit(1);
    }
    temp = (int *)malloc(sizeof(int) * (num_len + 1));    //创建动态数组
    for(i=1;i<=num_len;i++)
        temp[i] = array[i];        //保存原始数据
    for(j=1;j<k;j++)
    {
        for(carry = 0,i=1;i<=num_len;i++)
        {
            if(i <= array[0])            
                t = array[i] + temp[i] + carry;
            else
                t = array[i] + carry;    //处理最高位
            //数据位调整
            array[i] = t % 10;
            carry = t / 10;
        }
        if(carry)
            array[++num_len] = carry;    //在最高位记录进位标志
    }
    free(temp);
    array[0] = num_len;
}
//显示阶乖结果
void    Show_Result(int array[],int base_number)
{
    int i;
    printf("%4d!=",base_number);
    for(i=array[0];i>0;i--)
        printf("%d",array[i]);
    printf(" ");
}
//计算数据的阶乖
void    Count_Result(int array[], int base_number)
{
    int    k;
    array[0] = 1;
    array[1] = 1;
    for(k=2;k<=base_number;k++)
    {
        pnext(array,k);
        Show_Result(array,k);
    }
}
//:============================“大整数阶乖”问题的递推算法===========================
//:============================“斐波那契数列”问题的递推算法===========================
/*
    问题描述:
        标准斐波那契数列:
            F(0) = 0,F(1) = 1,Fn) = F(n-2) + F(n-1)(当n > 1时)
        广义斐波那契数列:
            F(0) = 0,F(1) = 0,F(2) = 1,Fn) = F(n-3) + F(n-2) + F(n-1)(当n > 2时)
*/
//标准斐波那契数列的递推算法函数
int        Std_Fibonacci(int number)
{
    int    f0 = 0,f1 = 1,result,loop;    //初始值1,2,返回结果,循环计数器
    if(number == 0)        return(0);
    if(number == 1)        return(1);
    for(loop = 2;loop <= number;loop ++)
    {
        result = f0 + f1;    //由前两步的结果计算当前结果--->“推出”
        f0 = f1;            //把原来的前一步当作下一次的前两步--->“传递”
        f1 = result;        //把当前结果当作下一次的前一步--->“传递”
    }//注意:在进行这种向前传递的操作时,特别小心传递的时序
    return(result);
}
//广义斐波那契数列的递推算法函数
int        Ext_Fibonacci(int number)
{
    int    f0 = 0,f1 = 0,f2 = 1,result,loop;    //初始值1,2,3,返回结果,循环计数器
    if(number == 0 || number == 1)        return(0);
    if(number == 2)        return(1);
    for(loop = 2;loop <= number;loop ++)
    {
        result = f0 + f1 + f2;    //由前三步的结果计算当前结果
        f0 = f1;
        f1 = f2;
        f2 = result;
    }//注意:在进行这种向前传递的操作时,特别小心传递的时序[即:变量间赋值的前后关系及先后顺序]
    return(result);
}
void    Run_Fibonacci()
{
    int    large,result;
    while(large!=9910)
    {
        printf(" 请输入斐波那契数列的元素个数[Enter '9910' to Exit]:	");
        scanf("%d",&large);
        if(large!=9910)
        {
            //result = Std_Fibonacci(large);
            result = Ext_Fibonacci(large-1);
            printf("斐波那契数据中的第[%d] = %d ",large,result);
        }
    }
}
//:============================“斐波那契数列”问题的递推算法===========================
int main(int argc, char* argv[])
{
/*
    int    LargeArray[MAXN],large = 0;
    while(large!=9910)
    {
        printf("请输入需要求取其阶乖的整数[Enter '9910' to Exit]:	");
        scanf("%d",&large);
        if(large!=9910)
            Count_Result(LargeArray,large);
    }
*/

    Run_Fibonacci();
    printf(" 应用程序运行结束! ");
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值