所求數越大,內存開銷越大……即N的值越大……N的值設爲1000,可求得400多的階乘……
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define N 800/* 只要N設得足夠大,可求到的階乘數越大,設到1000,可以求到400多的階乘*/
void main()
{
short i,j,k,r,x,flag,a[N];
for(i=0;i<N;i++)
a[i]=0;
x=flag=0;
i=j=k=1;
a[0]=a[1]=1;
printf("\n請輸入要計算階乘的數:");
scanf("%d",&x);
for(i=1;i<=x;i++)
{
int temp;
temp=0;
for(j=1;j<=k;j++)
{
if(flag!=1)
a[j]*=i;
else
{
a[j]=a[j]*i+temp;
flag=0;
}
if(a[j]>=10)
{
temp=a[j]/10;
a[j]=a[j]%10;
flag=1;
if(k==j)
k++;
}
}
}
printf("\n%d!=",i-1);
for(j=k;j>0;j--)
printf("%d",a[j]);
printf("\n");
getch();
}
下面的和上面的大同小異:
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define N 1008/* 只要N設得足夠大,可求到的階乘數越大,設到1000,可以求到400多的階乘*/
void main()
{
short i,j,k,r,x,flag,a[N];
double temp1,temp2;
for(i=0;i<N;i++)
a[i]=0;
x=flag=0;
i=j=k=1;
a[0]=a[1]=1;
temp1=0;
temp2=6;
scanf("%d",&x);
for(i=1;i<=x;i++)
{
for(j=1;j<=k;j++)
{
if(flag==1)
{
temp2=a[j]*i+temp1;
if(temp2<10)
a[j]=(short)temp2;
flag=0;
}
else
{
if(i<4)
a[j]*=i;
else
{
a[j]*=i;
if(a[j]>=10)
temp2=a[j];
}
}
if(temp2>=10)
{
temp1=temp2/10;
a[j]=(short)(temp2)%10;
flag=1;
if(k==j)
k++;
}
}
printf("%d!=",i);
for(j=k;j>0;j--)
printf("%d",a[j]);
printf("\n");
}
getch();
}
另一種求階乘方法:
書上例子,最大能求得26的階乘,之後會出錯……
#include"stdio.h"
void main()
{
int Data[40];
int Digit;
int i,j,r,k;
int N;
for(i=1;i<41;i++)
Data[i]=0;
Data[0]=1;
Data[1]=1;
Digit=1;
printf("Enter a number what you want to calculus:");
scanf("%d",&N);
for(i=1;i<N+1;i++)
{
for(j=1;j<Digit+1;j++)
Data[j]*=i;
for(j=1;j<Digit+1;j++)
{
if(Data[j]>10)
{
for(r=1;r<Digit+1;r++)
{
if(Data[Digit]>10)
Digit++;
Data[r+1]+=Data[r]/10;
Data[r]=Data[r]%10;
}
}
}
printf("%d!= ",i);
for(k=Digit;k>0;k--)
printf("%d",Data[k]);
printf("\n");
}
}
想關: