高精度之大数除法

2014-11-23 21:55:39 · 作者: · 浏览: 3

大数除法说的比较少或许不像加法减法那样简单,或许是用的不太多。到底怎么我也不知道。

反正你会了加法减法,乘法而不会除法,就像是,打开电脑而不玩游戏,心里难受。

我是从看到了大神博客后学习了一下。

http://blog.csdn.net/hitwhylz/article/details/9700935

博客中讲的很详细

让人一看就懂,我很佩服这位同学。果断的关注了。

毕竟别人写的是别人的。

自己写的才是自己的 。于是我就捋了捋,模仿这写了一遍;

思想就是:用减法来代替除法,但是一次一次的减太慢,我们就先见10的n次方次,n可不是乱来的 因为除数不能大于被除数 就以此来决定n的大小。

照着我下面的步骤先自己写一下试一试。

1我们来输入两个数,确定位数。判断大小关系;

2然后进行把输入的被除数除数进行倒置。因为做减法嘛,比如123-23 我们要先用3来减3 所以将数倒置把3放到0的位置我们就能从0开始逐个往后处理了。

3要处理的就是我们首先减多少。比如12345 - 2 因为我们先减10的n次方 我们在这决定先减20 还是200 还是2000

决定权在两个数位数相差多少。

4 下面我们要来做减法了 比如先减20000 下一次不能减20000了 ,我们就来减2000 这一次来处理。

并且来记录相减的次数 注意减20000 的时候减一次,和2000的时候减一次,这是相差10次的。

5 最后就是尾部的处理前导0 的问题了。

下满贴上代码:

#include
  
   
using namespace std;
//基础操作大数除法
int substract(char *a,char*b,int alen,int blen)
{
	if(alen
   
    =0;i--) { if(a[i]
    
     b[i] )break; } } for(int i=0;i
     
      =0;i--) { if(a[i]) return i+1; } return 0; } int main() { int cases; cin>>cases; while(cases--) { char _a[100]; char _b[100]; int _c[100]; memset(_c,0,sizeof(_c)); cin>>_a>>_b; int alen = strlen(_a); int blen =strlen(_b); if(blen>alen) { cout<<0<
      
       =0;i--) { if(i>=a_b) _b[i]=_b[i-a_b]; else _b[i]=0; } blen=alen; int temp; for(int i = 0 ; i<=a_b;i++) { while((temp = substract(_a,_b+i,alen,blen-i))>=0) { alen = temp; _c[a_b-i]++; } } int i=a_b; while(!_c[i]&&i>=0) i--; if(i>=0) for(i;i>=0;i--) cout<<_c[i]; else cout<<0<
       
        
我的代码中没有注释 因为原作者中的代码注释很详细很仔细,大家可以去参考一下。

好了!

感谢自己坚持。