转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8443699.html
思路:将除法转为连减,每次减去除数的一倍,指定会超时,比如9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 / 1。解决办法是将被除数扩大,扩大的时候直接在后边加0即可。然后用大数加法累加扩大倍数。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 int mult(int *a, int *b) 5 { 6 int i, j; 7 int flag=0; 8 for(i=max(a[0], b[0]); i>0; i--) 9 { 10 if(a[i]>b[i]) 11 { 12 flag=1; 13 break; 14 } 15 if(a[i]<b[i]) 16 { 17 flag=-1; 18 break; 19 } 20 } 21 if(flag==-1) return -1;//处理小于等于情况 22 if(flag==0) return 0; 23 24 int k=b[0];//将 b 的长度保留下来 25 26 //reverse(&b[1],&b[1]+b[0]);//扩大倍数 27 if(a[a[0]]>b[b[0]]) 28 { 29 reverse(&b[1],&b[1]+b[0]);//扩大倍数 30 b[0]+=(a[0]-b[0]);//比如3200和20 31 } 32 else 33 { 34 reverse(&b[1],&b[1]+b[0]);//扩大倍数 35 b[0]+=(a[0]-b[0]-1) ; 36 } 37 reverse(&b[1],&b[1]+b[0]); 38 39 for(i=1; i<=a[0]; i++)//做个减法 40 { 41 if(a[i]<b[i]) 42 { 43 a[i+1]--; 44 a[i]+=10; 45 } 46 a[i]-=b[i]; 47 } 48 while(a[a[0]]==0) 49 a[0]--; 50 51 52 53 int m=b[0]-k+1;//扩大倍数 54 reverse(&b[1],&b[1]+b[0]); 55 b[0]=k; 56 reverse(&b[1],&b[1]+b[0]); 57 return m; 58 } 59 60 int main() 61 { 62 string s1,s2; 63 cin>>s1>>s2; 64 int a[200]= {0},b[200]= {0}; 65 a[0]=s1.length(); 66 b[0]=s2.length(); 67 int i,j,t; 68 69 for(i=1; i<=a[0]; i++) 70 { 71 a[i]=s1[a[0]-i]-'0'; 72 } 73 while(a[a[0]]==0) 74 a[0]--; 75 for(i=1; i<=b[0]; i++) 76 { 77 b[i]=s2[b[0]-i]-'0'; 78 } 79 while(b[b[0]]==0) 80 b[0]--;/*读入数据并清除前导0,比如000003*/ 81 82 if(b[0]<1)//b为0的情况 83 { 84 return 0; 85 } 86 87 int c[200]= {0}; c[0]=1;//c数组用来保存结果 88 int d[250]= {0}; d[0]=1;//d数组用来保存临时返回结果 89 90 while(1) 91 { 92 t=mult(a,b);//做减法 93 if(t==-1) break;//被除数小于除数 94 if(t==0) d[1]=1;//被除数等于除数 95 else d[t]=1; 96 int k=max(c[0], t); 97 for(j=1; j<=k; j++) 98 { 99 c[j+1]+=(c[j]+d[j])/10; 100 c[j]=(c[j]+d[j])%10; 101 } 102 if(c[k+1]>0) c[0]=k+1; 103 else c[0]=k; 104 105 d[t]=0;//将d恢复 106 if(t==0) break; 107 } 108 for(i=c[0]; i>0; i--) 109 { 110 cout<<c[i]; 111 } 112 /* 113 cout<<endl; 114 cout<<"a余:"; 115 if(t==0) cout<<0; 116 else 117 for(i=a[0]; i>0; i--) 118 { 119 cout<<a[i]; 120 } 121 cout<<endl<<endl; 122 *//*注释部分为打印余数*/ 123 }