c - 在 C 中使用数组对非常大的数字进行除法

标签 c arrays

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

到目前为止,我已经完成了加法、减法和乘法。但我真的卡在了除法部分。

编辑: 新进展。正如一位 friend 提到的那样,我每次都需要将结果数组与除数进行比较,这样我就可以在除数大于被除数时随时停止进度。我设法做了一个很好的函数来每次比较它。此功能已单独测试并且工作正常。好的。现在我开始取得真正的进步。我得到了商。现在我将尝试将商放入数组中,以便我们可以处理更大的数字!

    #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
}

最佳答案

如果您要减去这些大数,最简单的解决方案是将这两个数字相减,直到剩下小于零的数字为止。这是基本的解决方案,有效但速度有点慢。

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

为了使其正常工作,您需要实现自己的比较功能。 假设您将 malloc 分配的大小存储在您的结构中的 filed 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;
  }
}

关于c - 在 C 中使用数组对非常大的数字进行除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29921719/

相关文章:

你能帮我一个符号状态表和嵌套开关吗?来自 Illustrationing C- Donald Alcock 的练习

c - 如何链接两个目标文件

javascript - 通过动态枚举其他对象的键来创建新对象

c - C 的新手 : Storing Structures in an Array

php - 更改数组的内容以提高效率

javascript - axios在react js中的get请求上给出错误

从 Infix 转换为 Postfix 并评估 Postfix 表示法

c - TCP 网络吞吐量测量

c - 我怎样才能实现像程序这样的功能?

java - 将 Double 转换为 Int 数组?