gpt4 book ai didi

c - 查找大整数序列的 LCM 时如何避免溢出错误

转载 作者:行者123 更新时间:2023-11-30 17:42:26 28 4
gpt4 key购买 nike

我需要找到一系列数字的最小公约数(最多 100 000 个数字,每个数字的范围为 [0, 2 000 000 000])

我使用以下算法 lcm(a,b) = (a/gcd(a,b)) * b

对于超过 2 个数字 lcm(a, lcm(b,c))... 查找 lcm 的标准方法适用于小输入值。

但是,对于大输入,即使我使用 long long int,它也会开始给出溢出错误...

如何避免出现许多较大整数值的溢出错误?

感谢您的帮助

最佳答案

在这种情况下,最小公倍数可能是一个具有数百位数字的大数。您需要处理这么大的整数。

gmplib library (-lgmp) 支持任意精度整数运算:

int have_read_first_number = 0;
mpz_t result, arg;
mpz_inits(result, arg, NULL);
mpz_set_ui(arg, 1u);

/* read decimal integers from stdin: one per line */
while((len = getline(&token, &capacity, stdin)) > 0) {
if (!have_read_first_number) { /* read the first integer */
parse_mpz(token, result);
have_read_first_number = 1; /* successfully read first integer */
}
else { /* read the rest of the numbers */
parse_mpz(token, arg);
}
/* lcm(a, b, c, d) = lcm(lcm(lcm(a, b), c), d) */
mpz_lcm(result, result, arg);
}
if (!have_read_first_number) /* error */
panic("no numbers read");

/* print result as decimal */
mpz_out_str(stdout, 10, result);
puts("");

示例:

$ gcc lcm.c -o lcm -lgmp && { seq 1 100 | ./lcm; }
69720375229712477164533808935312303556800

Complete program: lcm.c

关于c - 查找大整数序列的 LCM 时如何避免溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20581925/

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