【问题标题】:How to avoid overflow error when finding LCM for series of large integers查找大整数系列的 LCM 时如何避免溢出错误
【发布时间】:2013-12-14 10:03:50
【问题描述】:

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

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

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

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

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

感谢您的帮助

【问题讨论】:

    标签: c greatest-common-divisor lcm


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      相关资源
      最近更新 更多