使用C中的数组划分非常大的数字

vvv*_*vsg 9 c arrays

我正在尝试为非常大的数字(甚至比长的数字大)制作计算器,并且我正在使用数组来使其工作.

到目前为止,我已经完成了加法,减法和乘法.但我真的被困在分区.

编辑:新进展.作为一个朋友提到我需要每次将结果数组与除数进行比较,这样我可以在任何时候除数大于被除数时停止进度.我设法做了一个很好的功能来每次比较它.此功能单独测试,工作正常.好.现在我开始取得真正的进步.我得到了商.现在我将尝试在数组中放置商,以便我们可以使用更大的数字!

    #define MAX_SIZE 50
    #define SIZE_USE (MAX_SIZE-1)

    int div(int inum_first[], int inum_second[], int div_result[], int firstlen, int secondlen)
{
    int i;
    int check1 = 0, check2 = 0;

    int zeroC = 0;

    int tmp[MAX_SIZE];

    for (i = 0; i <= SIZE_USE; i++)
    {
        tmp[i] = 0;
    }

    int inum_firstCP[MAX_SIZE] = { 0 };

    for (i = 0; i <= 1; i++)
    {
        inum_firstCP[i] = inum_first[i]; // create a copy of inum_first
    }

    for (i = 0; i <= SIZE_USE; i++)
    {
        if (inum_first[i] != 0)
            check1++;

        if (inum_second[i] != 0)
            check2++;
    }

    if (secondlen > firstlen)
    {
        zeroC++;
        goto EOI;
    }

    if (check2 == 0)
    {
        puts("\nExpected error\n");
        return -1;
    }

    int j = 0, p = 0;

    int s = 0;
    int o = 1; // o is Quotient!

    do
    {
        for (i = SIZE_USE; i >= 0; i--)
        {
            if (tmp[i] = inum_firstCP[i] - inum_second[i] >= 0)
            {
                tmp[i] = inum_firstCP[i] - inum_second[i];
            }
            else
            {
                inum_firstCP[i - 1] = inum_firstCP[i - 1] - 1;
                tmp[i] = (inum_firstCP[i] + 10) - inum_second[i];
            }

            inum_firstCP[i] = tmp[i];

        }
    if (compare(inum_firstCP, inum_second, firstlen, secondlen) < 0) break;
    j++;
    o++;
    } while (j<MAX_SIZE); // anything else will also work

EOI:

    return 0;
}

int compare(int inum_firstCP[], int inum_second[], int firstlen, int secondlen)
{
    int c = 0, d = 0;
    int i;

    firstlen = MAX_SIZE, secondlen = MAX_SIZE; // temporary. will provide a better solution ASAP
    if (firstlen > secondlen)
    {
        return 1;
    }
    else if (secondlen > firstlen)
    {
        return -1;
    }
    else
    {
        for (i = 0; i < firstlen; i++)
        {
            if (inum_firstCP[i] > inum_second[i]) c++;
            else if (inum_second[i] > inum_firstCP[i]) d++;
        }
        if (c>d) return 1;
        else if (d>c) return -1;
    }

    return 0; // else
}
Run Code Online (Sandbox Code Playgroud)

cer*_*wny 5

如果您将这些大数相减,最简单的解决方案是取两个数,然后将另一个相减,直到剩下的东西小于零。这是基本的解决方案,它可以工作,但速度慢。

要使其更快,您可以执行以下操作:采用除数,将其乘以2,如果除数小于股息,则继续乘以。当您到达的第一个数字更大时,则将相应的位设置为1,然后减去相乘后的结果,然后对结果进行相同的操作。Wiki上很好地描述了同一件事。

为了使其工作,您需要实现自己的比较功能。假设您将malloc分配的大小存储在文件结构len中,则可以执行以下操作:

int compare( mynum &a, mynum &b){
  if (a.len() > b.len()){
     return 1;
  } else (if b.len() > a.len()){
   return -1;
  } else(){
    for(int i = b.len(); i > 0; i--){
      if (a[i] > b[i]){
        return 1;
      } else if(b[i] > a[i]){
        return -1;
      }
     }
   #if we get there the numbers are the same
   return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)