最近看書時遇到這樣的問題,寫點東西,幫助自己記憶。
【例1】編寫程序,對給定的n(n<100),計算並輸出k的階乘k!(k=1,2,3...,n)的全部有效數字。
要求的數組可能大大超出一般整數的位數,這時此題考慮的終點。
所以我們用一個數組a來存儲長整數。
存儲方法如下圖所示:
a[0],此整數的長度。
a[1],個位
a[2],十位
a[3],百位
...............
算法:計算階乘K!可采用對已求得的階乘(k-1)!連續累加K-1次後求出。例如,已知4!=24,計算5!,可對原來的24再累加4次24後得到120。詳細程序如下:
#include<stdio.h>
#include<malloc.h>
#define MAXN 1000
void pnext(int a[],int k){
int *b,m = a[0],i,j,r,carry;
b = (int *)malloc(sizeof(int)*(m+1));
for(i = 1;i<=m;i++) b[i] = a[i];
for(j = 1;j<k;j++){ //控制累加K-1次
for(carry = 0,i = 1;i<=m;i++){
r=(i<=a[0]?a[i] + b[i]:a[i]) + carry;
a[i] = r%10;carry = r/10;
}
if(carry) a[++m] = carry;
}
free(b);
a[0] = m;
}
void write (int *a ,int k){
int i;
printf("%4d!=",k);
for(int i=a[0];i>0;i--) printf("%d",a[i]);
printf("\n\n");
}
void main(){
int a[MAXN],n,k;
printf("Enter the number n:");
scanf("%d",&n);
a[0]=1;a[1]=1;write(a,1);
for(k=2;k<=n;k++){
pnext(a,k);
write(a,k);
getchar();
}
}