2017年計算機二級C++輔導實例編程(9)

字號:


    大整數(shù)階乘問題的遞推算法
    //:===========“大整數(shù)階乘”問題的遞推算法===========
    #define  MAXN 1000  //數(shù)據(jù)位數(shù)
    //用遞推法求取整數(shù)k的階乖,將結(jié)果放入數(shù)組array中
    void pnext(int array[],int k)
    {
    int *temp; //動態(tài)數(shù)組[臨時存儲運算大整數(shù)]
    int i,j,num_len = array[0],carry,t; //循環(huán)變量,長整數(shù)位數(shù),進位標志,臨時變量
    if(array[0] >= MAXN)
    {
    printf("數(shù)據(jù)處理位數(shù)超過程序設計上限,程序?qū)⒆詣又袛噙\行!\n");
    exit(1);
    }
    temp = (int *)malloc(sizeof(int) * (num_len + 1)); //創(chuàng)建動態(tài)數(shù)組
    for(i=1;i<=num_len;i++)
    temp[i] = array[i];  //保存原始數(shù)據(jù)
    for(j=1;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; //處理位
    //數(shù)據(jù)位調(diào)整
    array[i] = t % 10;
    carry = t / 10;
    }
    if(carry)
    array[++num_len] = carry; //在位記錄進位標志
    }
    free(temp);
    array[0] = num_len;
    }
    //顯示階乖結(jié)果
    void Show_Result(int array[],int base_number)
    {
    int i;
    printf("M!=",base_number);
    for(i=array[0];i>0;i--)
    printf("%d",array[i]);
    printf("\n\n");
    }
    //計算數(shù)據(jù)的階乘
    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);
    }
    }
    //:==========“大整數(shù)階乘”問題的遞推算法=========