Array Division - What is the best way to divide two numbers stored in an array?

前端 未结 7 1179
名媛妹妹
名媛妹妹 2021-01-13 16:51

I have two arrays (dividend, divisor):

dividend[] = {1,2,0,9,8,7,5,6,6};
divisor[] = {9,8};

I need the result (dividend/divisor) as:

<
相关标签:
7条回答
  • 2021-01-13 17:17

    You can use long division http://en.wikipedia.org/wiki/Long_division

    0 讨论(0)
  • 2021-01-13 17:20

    You can use Long division algorithm or the more general Polynomial Long Division.

    0 讨论(0)
  • 2021-01-13 17:21

    There you go! A is the divident. B is the divisor. C is the integer quotinent R is the rest. Each "huge" number is a vector retaining a big number. In huge[0] we retain the number of digits the number has and thren the number is memorized backwards. Let's say we had the number 1234, then the corespoding vector would 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=A-B;
    DIVIDHUGE: makes the division using the mentioned procedures...
    

    void Shl(Huge H, int Count)
    /* H <- H*10ACount */
    { 
      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)
            /* A <- A-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)
                /* A/B = C rest 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]--;
                }
    
    0 讨论(0)
  • 2021-01-13 17:22

    Do long division.

    Have a temporary storage of size equal to the divisor plus one, and initialized to zero:

    accumulator[] = {0,0,0};
    

    Now run a loop:

    1. Shift each digit of the quotient one space to the left.
    2. Shift each digit of the accumulator one space to the right.
    3. Take the next digit of the dividend, starting from the most-significant end, and store it to the least-significant place of the accumulator.
    4. Figure out accumulator / divisor and set the least-significant place of the quotient to the result. Set the accumulator to the remainder.

    Used to use this same algorithm a lot in assembly language for CPUs what didn't have division instructions.

    0 讨论(0)
  • 2021-01-13 17:26

    Is there a better way to do this?

    You can use long division.

    0 讨论(0)
  • 2021-01-13 17:27

    Other than that, have you considered using BigInt class (or the equivalent thing in your language) which will already does this for you?

    0 讨论(0)
提交回复
热议问题