分割存储在C中char数组中的任意大数

时间:2018-12-03 21:42:56

标签: c arrays char division

我的家庭作业的一部分要求将大整数相除,以至于我只能将它们存储在字符数组中(不允许使用GNU Bignum库)。除数和除数都可以是一千个数字,因此除法的结果也可能很长,因此除法的结果也必须存储在char数组中。我想为每个索引存储一位数字。

我正在尝试使用重复减法,直到除数小于除数并计算转数。最糟糕的情况是除数为2时,所以我必须为计数器数组分配“除法长度/ 2”的内存。

我已经实现了减法 getLength lengthCompare 函数,它们运行良好。到目前为止,这是我所做的:

char *division(char *divident, char *divisor, int len_divident, int len_divisor)
{
    if (divident == NULL || divisor == NULL)
    {
        return NULL;
    }

    char *cnt = (char*)malloc((len_divident/ 2) * sizeof(char));
    char *res = subtraction(divident, divisor, len_divident, len_divisor);
    int i = 0;

    do
    {
        res = subtraction(res, divisor, getLength(res), len_divisor);

        if (cnt[i] == 9)
        {
            i++;
        }

        cnt[i]++;

    } while (lengthCompare(res, divisor) == 1 || lengthCompare(res, divisor) == 0);

    cnt->digits[i + 1] = '\0';
    return cnt;
}

如果第一个参数长于第二个参数, lengthCompare 函数将返回1;如果第二个参数较长,则返回2;如果它们的长度相等,则返回0。

此代码不起作用-每次编译时,都会收到“错误-空间不足”消息。 编辑:具体来说,这是减法函数的一个例外: 引发未处理的异常:写访问冲突。 结果是0x1110112。

请注意,我是C语言的初学者,这可能不是执行我想要的最佳方法,但我想不到更好的方法。

我非常感谢任何批评和建议!

编辑:na重命名为除数和除数。

1 个答案:

答案 0 :(得分:1)

  

最坏的情况是...,所以我必须为计数器数组分配“分隔长度/ 2”个内存。

不太完全,最坏的情况是接近减法。

代码未分配足够的内存。

char *cnt = (char*)malloc((len_divident / 2) * sizeof(char));  // Bad

确保除数之后,表示没有前导零的值...

while (len_divisor > 0 && divisor == '0') {
  len_divisor--;
  divisor++;
}

....,所需空间不超过:

// As it looks like code is using strings
#define SPACE_FOR NULL_CHARACTER 1

size_t length = 1 + SPACE_FOR NULL_CHARACTER;
if (len_dividend > _len_divisor) {
  length = len_dividend - len_divisor + 1 + SPACE_FOR NULL_CHARACTER;
}

在C中不需要强制转换。如果要按指针的类型进行缩放,最好使用sizeof *pointer *,然后使用* sizeof(type)。正确编码,检查和维护更容易。

char *cnt = malloc(sizeof *cnt * length);

严格的代码将检查分配是否成功。

if (cnt == NULL) {
  Handle_OutOfMemory_Somehow();
}