2737:大整数除法

转载请注明出处: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 }

 

posted @ 2018-02-12 09:20  nefuer  阅读(1767)  评论(0编辑  收藏  举报