所求数越大,内存开销越大……即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");
- }
- }