“大整數階乖”問題的遞推演算法

gudesheng發表於2008-01-03
/*
    標題:<<系統設計師>>應試程式設計例項-[遞推演算法程式設計]
    作者:成曉旭
    時間: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;
}




Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935912


相關文章