大整數(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ù)階乘”問題的遞推算法=========