高精度算法求n阶阶乘

 1 #include "stdio.h"
 2 #include "String.h"
 3 #define MAX 10000
 4 int f[MAX];
 5 void Arr_reset(int a[],int m,int n)
 6 {
 7     int i;
 8     for(i=m;i<=m;i++)
 9     {
10         a[i]=0;
11     } 
12 }
13 int main(void)
14 {
15     int i,j,n;
16     printf("Enter n:");
17     scanf("%d",&n);
18     Arr_reset(f,0,(sizeof(f)/sizeof(int)));//对数组进行初始化
19     f[0]=1;
20     for(i=2;i<=n;i++)
21     {
22         //乘以 i
23         int c=0;
24         for(j=0;j<MAX;j++)//最不易理解的
25         {
26             int s=f[j]*i+c;
27             f[j]=s%10;
28             c=s/10;
29             //算出的 s 是单位数时,会连续覆盖 f[0]
30             //否则一个多位数会倒过来存储,如 123,f[0]存 3,f[1]存 2,f[3]存 1
31             //因此上式先求余,在求模
32         } 
33     }
34     for(j=MAX-1;j>=0;j--)
35         if(f[j])
36             break;//忽略前导 0
37     for(i=j;i>=0;i--)
38         printf("%d",f[i]);
39     printf("\n");
40     return 0;
41 }
#include<iostream>
using namespace std;
int main()
{
      int a[10000];
      int n;
      cout<<"请输入n 计算n的阶乘"<<endl; 
      while(cin>>n&&n>=0)
      {
              a[0]=1;
              int temp=0;
              int digit=1;
              
              for(int i=2;i<=n;i++)//该for循环对于大于2的阶乘才奏效。 
              {
                      int num=0;
                      for(int j=0;j<digit;j++)
                      {
                              temp=a[j]*i+num;
                              a[j]=temp%10; 
                              num=temp/10;
                      }
                      while(num)
                      {
                              a[digit]=num%10;//越前存储比如f[0]存4不动,f[1]存2。
                              num/=10;
                              digit++;
                      }
              }
              for(int i=digit-1;i>=0;i--)//反转输出,先输出f[1]为2,再输出f[0]为4。 
              {
                      cout<<a[i];
              }
              cout<<endl;
      }
      return 0;
}

不懂 没注释 存疑 

posted @ 2020-09-26 14:53  然终酒肆  阅读(391)  评论(0编辑  收藏  举报