大数除法

思路:模拟手算的过程


   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

具体实现略。

posted on 2012-07-24 13:15  L_S_X  阅读(5378)  评论(0编辑  收藏  举报

导航