code 31203; procedure LNG INT DIVIDE(U,V,QUOTIENT,REMAINDER); value U; integer array U,V,QUOTIENT,REMAINDER; begin integer LU,LV,V1,DIFF,I,T,SCALE,D,Q1,J,CARRY; LU:=U[0]; LV:=V[0]; V1:=V[1]; DIFF:=LU - LV; if LV=1 then begin CARRY:=0; for I:=1 step 1 until LU do begin T:=CARRY * 10 000 000 + U[I]; QUOTIENT[I]:=T//V1; CARRY:=T - QUOTIENT[I] * V1 end; REMAINDER[0]:=1; REMAINDER[1]:=CARRY; if QUOTIENT[1]=0 then begin for I:=2 step 1 until LU do QUOTIENT[I-1]:=QUOTIENT[I]; QUOTIENT[0]:=LU - (if LU=1 then 0 else 1) end else QUOTIENT[0]:=LU end LV=1 else if LU<LV then begin QUOTIENT[0]:=1; QUOTIENT[1]:=0; for I:=0 step 1 until LU do REMAINDER[I]:=U[I] end LU<LV else begin integer array A[0:LV]; SCALE:=10 000 000//(V1+1); if SCALE>1 then begin comment NORMALIZE U; CARRY:=0; for I:=LU step -1 until 1 do begin T:=SCALE * U[I] + CARRY; CARRY:=T//10 000 000; U[I]:=T - CARRY * 10 000 000 end; U[0]:=CARRY; comment NORMALIZE V; CARRY:=0; for I:=LV step -1 until 1 do begin T:=SCALE * V[I] + CARRY; CARRY:=T//10 000 000; V[I]:=T - CARRY * 10 000 000 end; V1:=V[1] end NORMALIZATION comment COMPUTE QUOTIENT AND REMAINDER; for I:=0 step 1 until DIFF do begin D:=U[I] * 10 000 000 + U[I+1]; Q1:=if U[I]=V1 then 9 999 999 else D//V1; if V[2] * Q1 > (D-Q1*V1) * 10 000 000 + U[I+2] then begin Q1:=Q1 - 1; if V[2]*Q1>(D-Q1*V1)*10 000 000+U[I+2] then Q1:=Q1-1 end; comment U[I:I+LV]:=U[I:I+LV] - Q1 * V[1:LV]; CARRY:=0; for J:=LV step -1 until 1 do begin T:=Q1 * V[J] + CARRY; CARRY:=T//10 000 000; A[J]:=T - CARRY * 10 000 000 end; A[0]:=CARRY; CARRY:=0; for J:=LV step -1 until 0 do begin T:=U[I+J] - A[J] + CARRY; CARRY:=if T<0 then -1 else 0; U[I+J]:=T - CARRY * 10 000 000 end; comment IF CARRY=-1 THEN Q1 IS ONE TOO LARGE, AND V MUST BE ADDED BACK TO U[I:I+LV]; if CARRY=-1 then begin Q1:=Q1 - 1; CARRY:=0; for J:=LV step -1 until 1 do begin T:=U[I+J] + V[J] + CARRY; CARRY:=if T<10 000 000 then 0 else 1; U[I+J]:=T - CARRY * 10 000 000 end end; QUOTIENT[I]:=Q1 end I; comment CORRECT STORAGE OF QUOTIENT; if QUOTIENT[0] ^= 0 then begin for I:=DIFF step -1 until 0 do QUOTIENT[I+1]:=QUOTIENT[I]; QUOTIENT[0]:=DIFF + 1 end else if DIFF < 2 then begin QUOTIENT[0]:= 1; if DIFF = 0 then QUOTIENT[1]:= 0 end else if QUOTIENT[1] ^= 0 then QUOTIENT[0]:=DIFF else begin for I:=1 step 1 until DIFF - 1 do QUOTIENT[I]:=QUOTIENT[I+1]; QUOTIENT[0]:=DIFF - 1 comment REMAINDER := U[DIFF+1:LU]//SCALE; if SCALE>1 then begin CARRY:=0; for I:=1 step 1 until LV do begin T:=CARRY * 10 000 000 + U[DIFF+I]; REMAINDER[I]:=T//SCALE; CARRY:=T - REMAINDER[I] * SCALE end end else for I:=1 step 1 until LV do REMAINDER[I]:=U[DIFF+I]; comment CORRECT STORAGE OF REMAINDER; I:=0; J:=LV; for I:=I+1 while REMAINDER[I]=0 and J>1 do J:=J-1; REMAINDER[0]:=J; if J<LV then for I:=1 step 1 until J do REMAINDER[I]:=REMAINDER[LV + I - J]; comment UNNORMALIZE THE DIVISOR V; if SCALE>1 then begin CARRY:=0; for I:=1 step 1 until LV do begin T:=CARRY * 10 000 000 + V[I]; V[I]:=T//SCALE; CARRY:=T - V[I] * SCALE end end end end LNG INT DIVIDE; eop