求得任意整數的階乘

所求數越大,內存開銷越大……即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");
	}
}

想關:

計算大數階乘


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章