gpt4 book ai didi

c - 在C中将数字数组乘以int

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:29 25 4
gpt4 key购买 nike

我有一个非常大的数字(>100 位长),所以它不能存储为 intunsigned long long(又名 uint64_t)。该数组如下所示:
{5, 1, 2 ... 8, 6}
该数组必须包含单个数字 int


问题

将此“数字”(将其保存为数组)乘以一个数字的简单且最重要的是有效的方法是什么?

我尝试过的

由于我是 C 语言的新手,所以这段代码不是杰作。远非如此。

struct returnpointer { int * pointer; int length; };

returnpointer mul_arrays(int * x, int y, int lengthof_x) {
returnpointer result_end;
int result[lengthof_x * 2 + 1];
int final_result[lengthof_x * 2 + 1];
int carry = 0;
int j = 0;
//multiply 'y' by all digits of x, which creates multidigit ints
//and also reverses the direction of the array (to allow carrying)
for (int i = lengthof_x; i >= 0; i--) {
result[j] = x[i] * y;
j++;
}
int i = 0;
j = lengthof_x
//this is the bit that doesn't work: it attempts to work out the carry
//however after hours of debugging I can't get it to work.
while (carry > 0 || i < lengthof_x + 1) {
if (result[j] > 9) {
carry = result[j] / 10;
final_result[i] = result[j] % 10;
final_result[i + 1] = carry;
} else {
final_result[i] = result[j];
carry = 0;
}
i++;
j--;
}
result_end.pointer = result;
result_end.length = i + 1;
return result_end;
}

此代码无法正常工作。这只是我尝试过的示例(如果有效,我就不会发布)。

此外,很高兴知道我正在(尝试)使用的方法是否最有效,因为它将被合并到的程序非常耗时,所以函数越快,整个过程的时间就越少程序将采取。

提前致谢。

编辑:

我的编译器是 g++。

最佳答案

根据要求,这是一个将数组乘以单个数字的代码示例。该数组是小端的。举一个简单的例子,我假设数组是固定长度的,一个更复杂的例子会分配数组内存并在数组增长太大时扩展它。

#include <stdio.h>

#define BIGLEN 20

typedef struct {
int length;
int array[BIGLEN];
} biggy_t;

void bigmul(biggy_t *big, int mul)
{
int carry = 0, partial;
for(int i = 0; i < big->length; i++) {
partial = big->array[i] * mul + carry;
big->array[i] = partial % 10;
carry = partial / 10;
}
if(carry) {
big->array[big->length] = carry;
big->length++;
}
}

void bigout(biggy_t *big)
{
for(int i = big->length-1; i >= 0; i--) {
printf("%d", big->array[i]);
}
}

int main(int argc, char *argv[])
{
biggy_t big = { 6, { 5, 1, 2, 3, 8, 6 }}; // reverse order
bigout(&big);
printf(" * 7 = ");

bigmul(&big, 7);
bigout(&big);
printf("\n");
}

程序输出

683215 * 7 = 4782505

我写了一个 bignum 实现,我可以在其中选择基数。 10 或 100 字节存储,32 位存储更多。坚持使用 10 的幂使得转换为十进制输出比 2 基数的幂更容易,并且由于没有使用存储类型的全部容量而导致的时间损失很小。

关于c - 在C中将数字数组乘以int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55306229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com