高精度 加减乘 阶乘 模板 ------------------------C语言——菜鸟级

long int res[N];
void add(long int *a,long int *b)//高精度加法 
{long int i,k=0,adw=0,flag=0,tem1,tem2;
    for(i=0;flag!=2;i++,k++)
        { if(a[i]==-1)tem1=0;else tem1=a[i];
           if(b[i]==-1)tem2=0; else tem2=b[i];
          res[k]=tem1+tem2+adw;//adw 进位位 
          adw=res[k]/10000;
          res[k]=res[k]%10000;
          if(a[i+1]==-1)flag++; 
          if(b[i+1]==-1)flag++;
        }if(adw)res[k++]=adw;//判断进位是否有值 
        res[k+1]=-1;//标记最高位 }
void sub(long int *a,long int *b)//高精度 减法 
{ long int tem,i,k=0,subw=0,flag=0;
    for(i=0;flag!=2;i++)
        {    if(b[i]==-1)tem=0;else tem=b[i];
             if(a[i]>=(tem+subw))res[k++]=a[i]-tem-subw,subw=0;//subw借位位 
             else res[k++]=10000+a[i]-tem-subw,subw=1;
             if(a[i+1]==-1)flag++;
             if(b[i+1]==-1)flag++;
        }
      while(res[k]<=0&&k>0)res[k]=0,k--;//去首位0 
        res[k+1]=-1;//标记最高位 
}
void mult(long int *a,long int *b)//高精度 乘法 
{   long int i,j,k;
    for(i=0;a[i]!=-1;i++)
    { 
      for(j=0;b[j]!=-1;j++)
      { res[i+j]+=a[i]*b[j];
if(res[i+j]>=10000)res[i+j+1]+=res[i+j]/10000,res[i+j]%=10000;
      }
        k=i+j+1; 
while(res[k]>=10000)res[k+1]+=res[k]/10000,res[k]%=10000,k++;
    }while(res[k]<=0&&k>0)k--;//去首位0 
    res[k+1]=-1;   }
void dsjc(long int n)//计算阶乘
{  long int i,j,m;long long int a[n];
      memset(a,0,sizeof(a));
      a[0]=1; j=0;m=0; //初始化
       do//计算阶乘 从 n 到 1 反计算
       { for(i=j=0;i<=m;i++)
         j+=a[i]*n,a[i]=j%C,j/=C;//C 为进制 此时 为 5位(100000)
       j?a[++m]=j:0;//判断是否进位
     }while(--n);
     printf("%ld",a[m]);//输出
     while(m) printf(" %05ld ",a[--m]);printf("\n");}

猜你喜欢

转载自blog.csdn.net/qq_41923622/article/details/80542754