当前位置 博文首页 > 文章内容

    高精度算法求n阶阶乘

    作者: 栏目:未分类 时间:2020-09-26 15:01:06

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



     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;
    }

    不懂 没注释 存疑