大整數加減乘除
#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");}