高精度运算 (参考模板...仅供参考)
比较简短的高精度加法和减法运算模板。大除法的日后更新。
1 /* 两个非负的大整数相加 */ 2 void big_plus(char a[],char b[],char ans[]) 3 { 4 int c[N],d[N]; 5 memset(c,0,sizeof(c)); memset(d,0,sizeof(d));//数组初始化 6 int len_a,len_b,i,j,k; 7 // 8 len_a=strlen(a); len_b=strlen(b); 9 // 10 i=1; 11 for(k=len_a-1;k>=0;k--) 12 c[i++]=a[k]-'0'; 13 j=1; 14 for(k=len_b-1;k>=0;k--) 15 d[j++]=b[k]-'0'; 16 // 17 k=len_a>len_b?len_a:len_b; //k取数组a、b中较长的长度 18 // 19 //处理进位 20 for(i=1;i<=k;i++) 21 { 22 c[i+1]+=(c[i]+d[i])/10; 23 c[i]=(c[i]+d[i])%10; 24 } 25 // 26 if(c[k+1]) //判断最高位是否有进位 27 ++k; 28 j=0; 29 for(i=k;i>=1;i--) 30 ans[j++]=c[i]+'0'; 31 }
1 int cmp(char a[],char b[]) 2 { 3 int lena,lenb,i; 4 lena=strlen(a); lenb=strlen(b); 5 if(lena<lenb) 6 return -1; 7 else if(lena>lenb) 8 return 1; 9 else 10 { 11 if(strcmp(a,b)==0) 12 return 0; 13 else 14 { 15 for(i=0;i<lena;i++) 16 { 17 if(a[i]>b[i]) 18 return 1; 19 if(b[i]>a[i]) 20 return -1; 21 } 22 } 23 } 24 } 25 /* 只考虑减数和被减数都为正数的情况 这个模板代码不是特别短...暂时没想到更优的... */ 26 void big_sub(char a[],char b[],char ans[]) 27 { 28 int lena,lenb,i,flag,k; int c[N],d[N],temp[N]; 29 memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); memset(temp,0,sizeof(temp)); 30 lena=strlen(a); lenb=strlen(b); 31 // 32 if(strcmp(a,b)==0) 33 { 34 strcpy(ans,"0"); 35 return; 36 } 37 //如果被减数大于减数 38 if(cmp(a,b)>0) 39 { 40 flag=0;//说明差为正 41 for(i=0;i<lena;i++) 42 c[i]=a[lena-1-i]-'0'; 43 for(i=0;i<lenb;i++) 44 d[i]=b[lenb-i-1]-'0'; 45 } 46 47 else //如果减数大于被减数 48 { 49 flag=1;//说明差为负 50 for(i=0;i<lenb;i++) 51 c[i]=b[lenb-i-1]-'0'; 52 for(i=0;i<lena;i++) 53 d[i]=a[lena-i-1]-'0'; 54 } 55 // 56 k=lena>lenb?lena:lenb; 57 for(i=0;i<k;i++) 58 { 59 if(c[i]<d[i]) 60 { 61 c[i+1]--; 62 temp[i]=c[i]+10-d[i]; 63 } 64 else 65 temp[i]=c[i]-d[i]; 66 } 67 //判断高位是否为0 68 while(!temp[i-1]) 69 { 70 --i; 71 --k; 72 } 73 if(flag) 74 { 75 for(i=1;i<=k;i++) 76 ans[i]=temp[k-i]+'0'; 77 ans[0]='-'; 78 } 79 else 80 { 81 for(i=0;i<k;i++) 82 ans[i]=temp[k-1-i]+'0'; 83 } 84 // 85 }
1 /* 两个非负大整数的乘积 */ 2 void big_mul(char a[],char b[],char ans[]) 3 { 4 int c[N],d[N],sum[2*N],i,j,temp,lena,lenb,len_sum; 5 lena=strlen(a); lenb=strlen(b); 6 memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); memset(sum,0,sizeof(sum)); 7 //逆序存放 8 for(i=0;i<lena;i++) 9 c[lena-i-1]=a[i]-'0'; 10 for(i=0;i<lenb;i++) 11 d[lenb-i-1]=b[i]-'0'; 12 // 13 //模拟乘法笔算 14 for(i=0;i<lena;i++) 15 { 16 temp=0; 17 for(j=0;j<lenb;j++) 18 { 19 sum[i+j]+=c[i]*d[j]+temp; 20 temp=sum[i+j]/10; 21 sum[i+j]%=10; 22 } 23 sum[i+lenb]=temp; 24 } 25 // 26 len_sum=lena+lenb-1; 27 while(!sum[len_sum]&&len_sum) 28 len_sum--; 29 //再次逆序存放结果 30 int book=0; 31 for(i=len_sum;i>=0;i--) 32 ans[book++]=sum[i]+'0'; 33 }