大数除法说的比较少或许不像加法减法那样简单,或许是用的不太多。到底怎么我也不知道。
反正你会了加法减法,乘法而不会除法,就像是,打开电脑而不玩游戏,心里难受。
我是从看到了大神博客后学习了一下。
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<iostream> using namespace std; //基础操作大数除法 int substract(char *a,char*b,int alen,int blen) { if(alen<blen) return -1; if(alen==blen) { for(int i=alen-1;i>=0;i--) { if(a[i]<b[i]) return -1; if(a[i]>b[i] )break; } } for(int i=0;i<alen;i++) { a[i]=a[i]-b[i]; if(a[i]<0) { a[i]+=10; a[i+1]--; } } for(int i = alen-1;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<<endl; continue; } if(alen%2) { for(int i=0;i<=alen/2;i++) { int t = _a[i]-‘0‘; _a[i]=_a[alen-1-i]-‘0‘; _a[alen-1-i]=t; } } else { for(int i=0;i<alen/2;i++) { int t = _a[i]-‘0‘; _a[i]=_a[alen-1-i]-‘0‘; _a[alen-1-i]=t; } } if(blen%2) { for(int i=0;i<=blen/2;i++) { int t=_b[i]-‘0‘; _b[i]=_b[blen-1-i]-‘0‘; _b[blen-1-i]=t; } } else { for(int i=0;i<blen/2;i++) { int t=_b[i]-‘0‘; _b[i]=_b[blen-1-i]-‘0‘; _b[blen-1-i]=t; } } int a_b = alen-blen; for(int i=alen-1;i>=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<<endl; cout<<endl; } return 0; }
我的代码中没有注释 因为原作者中的代码注释很详细很仔细,大家可以去参考一下。
好了!
感谢自己坚持。
高精度之大数除法
时间: 2024-10-07 07:36:34