我的家庭作业的一部分要求将大整数相除,以至于我只能将它们存储在字符数组中(不允许使用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语言的初学者,这可能不是执行我想要的最佳方法,但我想不到更好的方法。
我非常感谢任何批评和建议!
编辑:n
和a
重命名为除数和除数。
答案 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();
}