Go here! A is divident. B is a divisor. C is an integer R is the rest. Each "huge" number is a vector storing a large number. In huge [0], we store the number of digits, the number of which and the number are written in the reverse order. Let them say that we have number 1234, then the correction vector will be:
v[0]=4; //number of digits v[1]=4; v[2]=3; v[3]=2; v[4]=1;
....
SHL(H,1) does: H=H*10; SGN(A,B) Compares the A and B numbers SUBSTRACT(A,B) does: A=AB; DIVIDHUGE: makes the division using the mentioned procedures...
void Shl(Huge H, int Count) { memmove(&H[Count+1],&H[1],sizeof(int)*H[0]); memset(&H[1],0,sizeof(int)*Count); H[0]+=Count; } int Sgn(Huge H1, Huge H2) { while (H1[0] && !H1[H1[0]]) H1[0]--; while (H2[0] && !H2[H2[0]]) H2[0]--; if (H1[0] < H2[0]) { return -1; } else if (H1[0] > H2[0]) { return +1; } for (int i = H1[0]; i > 0; --i) { if (H1[i] < H2[i]) { return -1; } else if (H1[i] > H2[i]) { return +1; } } return 0; } void Subtract(Huge A, Huge B) { int i, T=0; for (i=B[0]+1;i<=A[0];) B[i++]=0; for (i=1;i<=A[0];i++) A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0; while (!A[A[0]]) A[0]--; } void DivideHuge(Huge A, Huge B, Huge C, Huge R) { int i; R[0]=0;C[0]=A[0]; for (i=A[0];i;i--) { Shl(R,1);R[1]=A[i]; C[i]=0; while (Sgn(B,R)!=1) { C[i]++; Subtract(R,B); } } while (!C[C[0]] && C[0]>1) C[0]--; }
source share