代码之家  ›  专栏  ›  技术社区  ›  josh

数组分割-什么是分割存储在一个数组中的两个数字的最佳方法?

  •  4
  • josh  · 技术社区  · 15 年前

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

    quotient[] = {1,2,3,4,5,6,7};
    

    我使用数组减法:

    • 从被除数中减去除数,直到被除数变为0或小于除数,每次商增加1,

    但这需要很长时间。有没有更好的办法?

    7 回复  |  直到 15 年前
        1
  •  1
  •   James McNellis    15 年前

    有没有更好的办法?

    你可以用 long division .

        2
  •  3
  •   Nietzche-jou    15 年前

    做长除法。

    临时存储器的大小等于除数加1,并初始化为零:

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

    现在运行循环:

    1. 将商的每一位向左移动一个空格。
    2. 从最有效的一端开始,取红利的下一个数字,并将其存储到累加器的最低有效位置。
    3. 找出 accumulator / divisor 并将商的最低有效位设置为结果。将累加器设置为余数。

    在汇编语言中,对于没有除法指令的cpu,经常使用同样的算法。

        3
  •  3
  •   Lie Ryan Bryan    15 年前

    除此之外,您是否考虑过使用BigInt类(或者在您的语言中使用等效的东西),它已经为您做到了这一点?

        4
  •  2
  •   Tauquir    15 年前

    http://en.wikipedia.org/wiki/Long_division

        5
  •  1
  •   Lie Ryan Bryan    15 年前
        6
  •  0
  •   dsolimano    15 年前

    在伪代码中:

    int dividend_number
    foreach i in dividend
        dividend_number *= 10
        dividend_number += i
    
    int divisor_number
    foreach i in divisor
        divisor_number *= 10
        divisor_number += i
    
    int answer = dividend_number / divisor_number;
    
        7
  •  0
  •   XCS    15 年前

    给你! A是分号。 C是整数引号 R是剩下的。 每一个“巨大”的数字都是一个保留着一个大数字的向量。在庞大的[0]中,我们保留了数字的位数,然后将数字向后存储。 假设数字是1234,那么核心向量是:

    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]--;
                }