中级守护
高精度除法, 这个和加减乘一样,我们都要从手算的角度入手。举一个例子,比如 524134 除以 123。结果是4261
第一位4的来源是 我们把 524和123对齐,然后进行循环减法,循环了4次,余32,将32134的前三位321继续和123对齐,循环减法2次,余75,把7534的前三位753和123对齐,循环减法6次,余15,将154和123对齐,只能减1次,所以结果是4 2 6 1。
把上述过程程序化
1.把A,B两个数存入char数组 0下标表示的是最高位
2.把A的前lenB位和B对齐进行大小比较
3.如果2的比较结果里A的前lenB位大,那么就进行循环减法,直到它比B小,循环的次数记作s[0]表示最终结果的最高位
4.如果2的比较结果里A的前lenB位小,什么也不做.
5.把B整体向后以一位,和A的最高位对齐(最高位可能暂时是0) 把s的下标迭代+1 表示进行下一位的计算
6.不断地比较,直到当B的尾部和A的尾部对齐时,说明A的最后lenB位也进行了循环减法算数,所以得到了结果.终止程序
//以上提到的lenB都是最开始的B的长度,后来由于移位会导致增大
求采纳!!!
初级启示者
跟乘法一样,但如果是double内型的那我就不说了。
跟减法也很像,主要是
此题最好不要用stringstream做,比如说本蒟蒻
设a=10000000
b=10
换算我不说了
0/0=n a n
0/1=0
c末尾=0
若有余数,就借位,以此内推
修练者
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
#define DIGIT 4
#define DEPTH 10000
#define MAX 30000
typedef int bignum_t[MAX+1];
int read(bignum_t a,istream& is=cin){
char buf[MAX*DIGIT+1],ch;
int i,j;
memset((void*)a,0,sizeof(bignum_t));
if (!(is>>buf)) return 0;
for (a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch;
for (a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
for (i=1;i<=a[0];i++)
for (a[i]=0,j=0;j<DIGIT;j++)
a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0';
for (;!a[a[0]]&&a[0]>1;a[0]--);
return 1;
}
void write(const bignum_t a,ostream& os=cout){
int i,j;
for (os<<a[i=a[0]],i--;i;i--)
for (j=DEPTH/10;j;j/=10)
os<<a[i]/j%10;
}
void sub(bignum_t a,const bignum_t b,const int c,const int d){
int i,O=b[0]+d;
for (i=1+d;i<=O;i++)
if ((a[i]-=b[i-d]*c)<0)
a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH;
for (;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
for (;!a[a[0]]&&a[0]>1;a[0]--);
}
int comp(const bignum_t a,const int c,const int d,const bignum_t b){
int i,t=0,O=-DEPTH*2;
if (b[0]-a[0]<d&&c)
return 1;
for (i=b[0];i>d;i--){
t=t*DEPTH+a[i-d]*c-b[i];
if (t>0) return 1;
if (t<O) return 0;
}
for (i=d;i;i--){
t=t*DEPTH-b[i];
if (t>0) return 1;
if (t<O) return 0;
}
return t>0;
}
void div(bignum_t c,bignum_t a,const bignum_t b){
int h,l,m,i;
memset((void*)c,0,sizeof(bignum_t));
c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1;
for (i=c[0];i;sub(a,b,c[i]=m,i-1),i--)
for (h=DEPTH-1,l=0,m=(h+l+1)>>1;h>l;m=(h+l+1)>>1)
if (comp(b,m,i-1,a)) h=m-1;
else l=m;
for (;!c[c[0]]&&c[0]>1;c[0]--);
c[0]=c[0]>1?c[0]:1;
}
int main()
{
bignum_t a,b,c;
read(a);
read(b);
div(c,a,b);
write(c);
cout<<endl;
write(a);
cout<<endl;
return 0;
}