c-如何避免在为一系列大整数查找LCM时出现溢出错误



我需要找到一系列数字的最小公约数(最多10万个数字,每个数字都在[0,2000 000 000]的范围内)

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

对于2个以上的数字lcm(a,lcm(b,c))求lcm的标准方法。。。正在为小输入值工作。

然而,对于大的输入,即使我使用了长整型…,它也会开始出现溢出错误

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

感谢您的帮助

在这种情况下,最小公倍数可以是一个包含数百位数字的大数字。你需要处理这么大的整数。

gmplib库(-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

完整程序:lcm.c

最新更新