1. 程式人生 > 其它 >C-大數相乘大數相除

C-大數相乘大數相除

技術標籤:Cc語言

結果:

程式碼:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int main()
{
  int a[9],b[9],c[19],d[9],e[28],g[28];
  int n;
  scanf("%d",&n);
  int w=n,x=n+1,y=2*n+1,i=0,j=0,k,p,q,f,h=0,t;
  int temp;
  while(w>0)
  {
      a[i++]=w%10;   //兩個因數存為陣列,從個位開始存
      w/=10;
  }
  while(x>0)
  {
      b[j++]=x%10;
      x/=10;
  }
  for(k=0;k<19;k++)  //乘積陣列初始化為0
  {
      c[k]=0;
  }
  for(p=0;p<i;p++)
  {
      f=p;
      for(q=0;q<j;q++)
      {
          c[f]+=a[p]*b[q];   //從各位開始逐位相乘
          c[f+1]+=c[f]/10;
          c[f++]%=10;

      }
  }
///以上是兩個大數相乘,c[]為乘積從個位開始的倒序排列
  while(y>0)   //2*n+1
  {
      d[h++]=y%10;
      y/=10;
  }
  for(k=0;k<28;k++)  //乘積陣列初始化為0
  {
      e[k]=0;
      g[k]=0;
  }
  for(p=0;p<f;p++)
  {
      t=p;
      for(q=0;q<h;q++)
      {
          e[t]+=c[p]*d[q];   //從各位開始逐位相乘
          e[t+1]+=e[t]/10;
          e[t++]%=10;

      }
  }
///以上是三個大數相乘,e[]為乘積從個位開始的倒序排列

  for(i=0;i<28;i++)
  {
      printf("%d ",e[i]);
  }
  for(i=0,t--;i<=t/2;i++)   //將逆置的陣列反轉為正序

  {
      temp=e[i];
      e[i]=e[t-i];
      e[t-i]=temp;
  }
  printf("\n");
  for(i=0;i<28;i++)
  {
      printf("%d ",e[i]);
  }
///大數除法
  for(i=0;i<=t;)
  {
      g[i]=e[i]/6;
      k=e[i]%6;
      e[++i]+=k*10;
  }

  printf("\n");
  for(i=0;i<28;i++)
  {
      printf("%d ",g[i]);
  }
  return 0;
}