求得任意整数的阶乘

所求数越大,内存开销越大……即N的值越大……N的值设为1000,可求得400多的阶乘……


  1. #include<stdio.h>    
  2. #include<math.h>    
  3. #include<conio.h>    
  4. #define N 800/* 只要N设得足够大,可求到的阶乘数越大,设到1000,可以求到400多的阶乘*/    
  5.  void main()    
  6.  {    
  7.     short i,j,k,r,x,flag,a[N];    
  8.         
  9.     for(i=0;i<N;i++)    
  10.         a[i]=0;    
  11.     x=flag=0;    
  12.     i=j=k=1;        
  13.     a[0]=a[1]=1;    
  14.         
  15.     printf("\n请输入要计算阶乘的数:");  
  16.     scanf("%d",&x);    
  17.     for(i=1;i<=x;i++)    
  18.     {           
  19.         int temp;    
  20.         temp=0;    
  21.         for(j=1;j<=k;j++)    
  22.         {                   
  23.             if(flag!=1)    
  24.                 a[j]*=i;    
  25.             else    
  26.             {    
  27.                 a[j]=a[j]*i+temp;    
  28.                 flag=0;                     
  29.             }                   
  30.             if(a[j]>=10)    
  31.             {    
  32.                 temp=a[j]/10;    
  33.                 a[j]=a[j]%10;    
  34.                 flag=1;     
  35.                 if(k==j)    
  36.                     k++;    
  37.             }    
  38.         }              
  39.     }   
  40.     printf("\n%d!=",i-1);    
  41.         for(j=k;j>0;j--)    
  42.             printf("%d",a[j]);          
  43.         printf("\n");   
  44.     getch();    
  45.  }  


下面的和上面的大同小异:

  1. #include<stdio.h>  
  2. #include<math.h>  
  3. #include<conio.h>  
  4. #define N 1008/* 只要N设得足够大,可求到的阶乘数越大,设到1000,可以求到400多的阶乘*/  
  5.  void main()  
  6.  {  
  7.     short i,j,k,r,x,flag,a[N];  
  8.     double temp1,temp2;  
  9.       
  10.     for(i=0;i<N;i++)  
  11.         a[i]=0;  
  12.     x=flag=0;  
  13.     i=j=k=1;      
  14.     a[0]=a[1]=1;  
  15.     temp1=0;  
  16.     temp2=6;  
  17.       
  18.     scanf("%d",&x);  
  19.     for(i=1;i<=x;i++)  
  20.     {         
  21.         for(j=1;j<=k;j++)  
  22.         {                 
  23.             if(flag==1)  
  24.             {  
  25.                 temp2=a[j]*i+temp1;  
  26.                 if(temp2<10)  
  27.                     a[j]=(short)temp2;  
  28.                 flag=0;                   
  29.             }  
  30.             else  
  31.             {  
  32.                 if(i<4)  
  33.                     a[j]*=i;  
  34.                 else  
  35.                 {  
  36.                     a[j]*=i;  
  37.                     if(a[j]>=10)  
  38.                         temp2=a[j];  
  39.                 }  
  40.             }  
  41.             if(temp2>=10)  
  42.             {                                 
  43.                 temp1=temp2/10;  
  44.                 a[j]=(short)(temp2)%10;               
  45.                 flag=1;   
  46.                 if(k==j)  
  47.                     k++;  
  48.             }  
  49.         }  
  50.         printf("%d!=",i);  
  51.         for(j=k;j>0;j--)  
  52.             printf("%d",a[j]);        
  53.         printf("\n");  
  54.           
  55.     }    
  56.     getch();  
  57.  }  


另一种求阶乘方法:

书上例子,最大能求得26的阶乘,之后会出错……

  1. #include"stdio.h"  
  2. void main()  
  3. {  
  4.     int Data[40];  
  5.     int Digit;  
  6.     int i,j,r,k;  
  7.     int N;  
  8.     for(i=1;i<41;i++)  
  9.         Data[i]=0;  
  10.     Data[0]=1;  
  11.     Data[1]=1;  
  12.     Digit=1;  
  13.     printf("Enter a number what you want to calculus:");  
  14.     scanf("%d",&N);  
  15.     for(i=1;i<N+1;i++)  
  16.     {  
  17.         for(j=1;j<Digit+1;j++)  
  18.             Data[j]*=i;  
  19.         for(j=1;j<Digit+1;j++)  
  20.         {  
  21.             if(Data[j]>10)  
  22.                 {  
  23.                     for(r=1;r<Digit+1;r++)  
  24.                     {  
  25.                         if(Data[Digit]>10)  
  26.                                 Digit++;  
  27.                             Data[r+1]+=Data[r]/10;  
  28.                             Data[r]=Data[r]%10;  
  29.                     }  
  30.                 }  
  31.         }  
  32.         printf("%d!= ",i);  
  33.         for(k=Digit;k>0;k--)  
  34.             printf("%d",Data[k]);  
  35.         printf("\n");  
  36.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值