大整數加減乘除

來源:互聯網
上載者:User

大整數加減乘除

#include <stdio.h>#define MAXINT 1000int compare(int a[],int b[]);int bigplus(int a[],int b[],int c[]);int bigsub(int a[],int b[],int c[]);int bigmult(int a[],unsigned int b,int c[]);int bigmult2(int a[],int b[],int c[]);int bigdiv(int a[],unsigned int b,int c[],int *d);int bigdiv2(int a[],int b[],int c[],int d[]);int main(int argc, char *argv[]){    //a[0],b[0]表示位元,並且a[1],b[1]表示個位,以此類推  int a[MAXINT]={10,5,4,6,5,4,3,2,1,1,1};     //被乘數或被除數  int b[MAXINT]={7,7,6,5,4,3,2,1};     //乘數或除數  int c[MAXINT],d[MAXINT];                    //c[]存放商,d[]存放餘數  int div=1234;                               //小乘數或小除數  int k=0;  int *res=&k;                                //小餘數整數指標  int i=0;  int j;  for(j=a[0];j>=1;j--)    printf("%d",a[j]);//數a  printf("\n");  for(j=b[0];j>=1;j--)//數b    printf("%d",b[j]);  printf("\n");  bigplus(a,b,c);  bigsub(a,b,c);  bigmult(a,div,c);  bigmult2(a,b,c);  bigdiv(a,div,c,res);  bigdiv2(a,b,c,d);  getchar();  return 0;}int compare(int a[],int b[])          //比較大整數的大小{    int i;    if (a[0]>b[0]) return 1;          //比較a,b的位元確定傳回值    else if (a[0]<b[0]) return -1;    else                              //位元相等時的比較    {        i=a[0];        while (a[i]==b[i])            //逐位比較           i--;        if (i==0) return 0;        else if (a[i]>b[i]) return 1;        else return -1;    }}int bigplus(int a[],int b[],int c[])  //大整數加法{    int i,len;    len=(a[0]>b[0]?a[0]:b[0]);  //a[0] b[0]儲存數組長度,len為較長的一個    for(i=0;i<MAXINT;i++)       //將數組清0        c[i]=0;    for (i=1;i<=len;i++)        //計算每一位的值    {        c[i]+=(a[i]+b[i]);        //printf("%d,%d,%d\n",a[i],b[i],c[i]);        if (c[i]>=10)        {           c[i]-=10;            //大於10的取個位           c[i+1]++;            //高位加1        }    }    if (c[i+1]>0) len++;        c[0]=len;                //c[0]儲存結果數組實際長度    printf("Big integers add: ");    for (i=len;i>=1;i--)                printf("%d",c[i]); //列印結果        printf("\n");    return 0;}int bigsub(int a[],int b[],int c[]) //大整數減法{    int i,len;    len=(a[0]>b[0]?a[0]:b[0]);  //a[0]儲存數字長度,len為較長的一個    for(i=0;i<MAXINT;i++)       //將數組清0        c[i]=0;    if (compare(a,b)==0)        //比較a,b大小    {       printf("Result:0");       return 0;    }    else if (compare(a,b)>0)    for (i=1;i<=len;i++)        //計算每一位的值    {        c[i]+=(a[i]-b[i]);        if (c[i]<0)        {           c[i]+=10;            //小於0的原位加10           c[i+1]--;            //高位減1        }    }    else        for (i=1;i<=len;i++)        //計算每一位的值        {        c[i]+=(b[i]-a[i]);        if (c[i]<0)        {           c[i]+=10;            //小於0原位加10           c[i+1]--;            //高位減1        }        }    while (len>1 && c[len]==0)  //去掉高位的0        len--;    c[0]=len;    printf("Big integers sub= ");    if (a[0]<b[0]) printf("-");    for(i=len;i>=1;i--)         //列印結果        printf("%d",c[i]);    printf("\n");    return 0;}int bigmult(int a[],unsigned int b,int c[])//高精度乘以低精度{    int len,i;    for (i=0;i<MAXINT;i++)                  //數組清0      c[i]=0;    len=a[0];    for(i=1;i<=len;i++)                     //對每一位計算    {       c[i]+=a[i]*b;       c[i+1]+=c[i]/10;       c[i]%=10;    }    while (c[++len]>=10)                    //處理高位    {       c[len+1]=c[len]/10;       c[len]%=10;    }    if (c[len]==0) len--;                   //處理高進位為0情況    printf("Big integrs multi small integer: ");    for (i=len;i>=1;i--)        printf("%d",c[i]);    printf("\n");}int bigmult2(int a[],int b[],int c[])      //高精度乘以高精度{    int i,j,len;    for (i=0;i<MAXINT;i++)                  //數組清0        c[i]=0;    for (i=1;i<=a[0];i++)                  //被乘數迴圈      for (j=1;j<=b[0];j++)                //乘數迴圈      {         c[i+j-1]+=a[i]*b[j];              //將每一位計算累加         c[i+j]+=c[i+j-1]/10;              //將每一次結果累加到高一位         c[i+j-1]%=10;                     //計算每一次的個位      }   len=a[0]+b[0];                          //取最大長度   while (len>1 && c[len]==0)              //去掉高位0      len--;   c[0]=len;   printf("Big integers multi: ");   for (i=len;i>=1;i--)                    //列印結果      printf("%d",c[i]);   printf("\n");}int bigdiv(int a[],unsigned int b,int c[],int *d) //高精度除以低精度{                                           //a[] 為被乘數,b為除數,c[]為結果,d為餘數    int i,len;    len=a[0];                          //len為a[0]的數組長度    for (i=len;i>=1;i--)    {       (*d)=10*(*d)+a[i];                        //計算每一步餘數       c[i]=(*d)/b;                           //計算每一步結果       (*d)=(*d)%b;                              //求模餘數    }    while (len>1 && c[len]==0) len--;        //去高位0    printf("Big integer div small integer: ");    for (i=len;i>=1;i--)                    //列印結果      printf("%d",c[i]);    printf("\tArithmetic compliment:%d",*d);    printf("\n");}int bigdiv2(int a[],int b[],int c[],int d[])  //高精度除以高精度{   int i,j,len;   if (compare(a,b)<0)                        //被除數較小直接列印結果   {     printf("Result:0");     printf("Arithmetic compliment:");     for (i=a[0];i>=1;i--) printf("%d",a[i]);     printf("\n");     return -1;   }   for (i=0;i<MAXINT;i++)                     //商和餘數清0   {      c[i]=0;      d[i]=0;   }   len=a[0];d[0]=0;   for (i=len;i>=1;i--)                       //逐位相除   {      for (j=d[0];j>=1;j--)        d[j+1]=d[j];      d[1]=a[i];                              //高位*10+各位      d[0]++;                                 //數組d長度增1      while (compare(d,b)>=0)                 //比較d,b大小      {            for (j=1;j<=d[0];j++)              //做減法d-b            {                d[j]-=b[j];                if (d[j]<0)                {                   d[j]+=10;                   d[j+1]--;                }            }                while (j>0 && d[j]==0)        //去掉高位0                      j--;                d[0]=j;            c[i]++;                           //商所在位值加1      }   }   j=b[0];   while (c[j]==0 && j>0) j--;                //求商數組c長度     c[0]=j;   printf("Big integers div result: ");   for (i=c[0];i>=1;i--)                      //列印商     printf("%d",c[i]);   printf("\tArithmetic compliment: ");       //列印餘數   for (i=d[0];i>=1;i--)     printf("%d",d[i]);   printf("\n");}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.