大数除法
思路:模拟手算的过程
1.高精度除以低精度
注意:低精度的范围(int)
1 /*高精度除低精度求商模板*/ 2 /*大数除法 ------除数为int范围*/ 3 #include<iostream> 4 #define N 1000 5 using namespace std; 6 void division(char * src,int n) 7 { 8 int len = strlen(src),i,k,t=0,s=0; 9 char dest[N]; 10 bool flag = true; //商是否有了第一个有效位,防止商首部一直出现0 11 for(i=0,k=0; i<len; i++) 12 { 13 t = s*10+(src[i]-48); //新余数 14 if(t/n>0 || t==0) //余数为0要修改商 15 { 16 dest[k++] = t/n+48,s = t%n,flag = false; 17 } 18 else //不够除,修改余数 19 { 20 s = t; 21 if(!flag) //商已经有有效位了,补零 22 dest[k++] = '0'; 23 } 24 } 25 for(i=0;i<k;i++) 26 cout<<dest[i]; 27 cout<<endl; 28 } 29 int main() 30 { 31 char num[N]; 32 int n; 33 while(scanf("%s%d",num,&n)!=EOF) 34 { 35 division(num,n); 36 } 37 return 0; 38 }
2.高精度除以高精度
注意:优化部分
1 /*大数除法---高精度除高精度*/ 2 /* 3 1.a.size<b.size 返回-1 4 2.a.size=b.size && a-b<0 返回-1 5 3.a.size=b.size && a-b=0 返回0 6 */ 7 #include<iostream> 8 #include<cstring> 9 #include<string> 10 #define N 2000 11 using namespace std; 12 //判断a.size 与b.size 的关系 以及做减法 13 int judge(char a[],int a1,char b[],int b1) 14 { 15 int i; 16 if(a1<b1)return -1;//a.size<b.size 17 bool flag=false; 18 if(a1==b1) //a.size==b.size && a<b 19 { 20 for(i=a1-1;i>=0;i--) 21 if(a[i]>b[i]) 22 flag=true; 23 else if (a[i]<b[i]) 24 { 25 if(!flag) return -1; 26 } 27 } 28 for(i=0;i<a1;i++)//前提b中b1---a1部分必须为'0' 29 { 30 a[i]=a[i]-b[i]+48;//'0'的ASCII为48 31 if((a[i]-'0')<0) 32 { 33 a[i]=a[i]+10;a[i+1]=a[i+1]-1; 34 } 35 } 36 for(i=a1-1;i>=0;i--) //返回被除数的长度 37 if(a[i]!='0') 38 return (i+1); 39 return 0;//a.size==b.size&&a=b的情况 40 } 41 string division(string a,string b) 42 { 43 char x1[N],x2[N]; 44 int ans[N]; 45 int a_len,b_len,i,j; 46 a_len=a.length(); 47 b_len=b.length(); 48 /*初始化部分*/ 49 /*********************************************/ 50 memset(x1,'0',sizeof(x1)); 51 memset(x2,'0',sizeof(x2)); 52 memset(ans,0,sizeof(ans)); 53 for(i=a_len-1,j=0;i>=0;i--) 54 x1[j++]=a[i]; 55 for(i=b_len-1,j=0;i>=0;i--) 56 x2[j++]=b[i]; 57 /*********************************************/ 58 /*分析部分*/ 59 /*********************************************/ 60 if(a_len<b_len) return "0"; 61 int temp_len=judge(x1,a_len,x2,b_len); 62 if(temp_len<0)return "0"; 63 if(temp_len==0)return "1"; 64 ans[0]++;//减掉一次,商加1 65 int ntimes=temp_len-b_len; 66 if(ntimes<0) 67 return "1"; 68 else if(ntimes>0) 69 //扩充数位,加快减法。 70 { 71 for(i=temp_len-1;i>=0;i--) 72 if(i>=ntimes) 73 x2[i]=x2[i-ntimes]; 74 else 75 x2[i]='0'; 76 } 77 b_len=temp_len; 78 /*********************************************/ 79 /*加快除法的部分*/ 80 /********************************************/ 81 for(j=0;j<=ntimes;j++) 82 { 83 int ntemp; 84 while((ntemp=judge(x1,temp_len,x2+j,b_len-j))>=0) 85 { 86 temp_len=ntemp; 87 ans[ntimes-j]++; 88 } 89 } 90 /*********************************************/ 91 /*处理最后结果进位部分*/ 92 /*********************************************/ 93 for(i=0;i<N;i++) 94 if(ans[i]>=10) 95 { 96 ans[i+1]+=ans[i]/10; 97 ans[i]%=10; 98 } 99 /*********************************************/ 100 /*返回string类型*/ 101 /*********************************************/ 102 int k=N-1; 103 string c=""; 104 while(ans[k]==0&&k>0)k--; 105 for(i=k;i>=0;i--) 106 c+=(ans[i]+'0'); 107 /*********************************************/ 108 return c; 109 } 110 int main() 111 { 112 string a,b; 113 while(cin>>a>>b) 114 { 115 cout<<division(a,b)<<endl; 116 } 117 return 0; 118 }
3.牛顿迭代法,除以一个数等于乘上这个数的倒数。
ui+1=ui(2-uiv) ---------------v指的是x的值
u二次收敛与1/v
具体实现略。