大数的阶乘(乘法)及加法(详细模板)


话不多说,上代码,自己看。


#include<cstdio>
#include<iostream>
using namespace std;


void add(int num1[200],int num2[200])
{
  int i,M=199;
  for(i=0;i<M;i++)
      {
          num1[i]+=num2[i];
          if(num1[i]>9)
          {
              num1[i]-=10;
              num1[i+1]++;
          }
      }
      for(i=M;i>=0 ;--i)
        {
                if(num1[i]!=0)
                    {
                      for(;i>=0;--i)
                    printf("%d",num1[i]);
                    }
                    else   continue;
       }
       printf("\n");
}


int main()
{
    int carry,n,j,m,digit,digit1,temp,i;    //carry进位 digit,digit1是位数
    int a[200],b[200];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
      fill(a,a+200,0);
      fill(b,b+200,0);
      a[0]=1,b[0] = 1;
      digit=1,digit1=1;
      for(i=2; i<=n; i++)
      {
          for(carry=0,j=1; j<=digit; ++j)
          {
            temp=a[j-1]*i+carry;//相应阶乘中的一项与当前所得临时结果的某
                               //位相乘(加上进位)
            a[j-1]=temp%10;   //更新临时结果的位上信息
            carry=temp/10;   //看是否有进位
          }
         while(carry)
         {
            a[++digit-1]=carry%10;  //新加一位,添加信息。位数增1
            carry/=10;              //看还能不能进位
         }
     }




    for(i=2; i<=m; i++)
       {
         for(carry=0,j=1; j<=digit1; ++j)
         {
            temp=b[j-1]*i+carry;//相应阶乘中的一项与当前所得临时结果的某
                               //位相乘(加上进位)
            b[j-1]=temp%10;   //更新临时结果的位上信息
            carry=temp/10;   //看是否有进位
         }
         while(carry)
         {
            b[++digit1-1]=carry%10;  //新加一位,添加信息。位数增1
            carry/=10;              //看还能不能进位
         }
      }
      add(a,b);
 }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/igoforward/article/details/52107694
今日推荐