【问题标题】:Solving math with integers larger than any available integer data type用大于任何可用整数数据类型的整数求解数学
【发布时间】:2019-02-05 19:08:24
【问题描述】:

在一些数字大于任何可用的整数数据类型的编程比赛中,我们经常使用字符串来代替。

问题 1: 给定这么大的数,如何计算下面表达式中的ef

(a/b) + (c/d) = e/f

注意:GCD(e,f) = 1,即它们必须是最小化的形式。例如 {e,f} = {1,2} 而不是 {2,4}
此外,所有 a,b,c,d 都是我们已知的大数。

问题 2: 有人还可以建议一种方法来找到两个大数的 GCD(比任何可用的整数类型都大)吗?

【问题讨论】:

  • 数字有多大?
  • 大于 long long int
  • 你可以使用Java或Python吗?要求人们在 CP 中实现大整数似乎并不常见。无论如何,您知道 long long int 中的数字有多大吗?

标签: string algorithm math c++14 largenumber


【解决方案1】:

我建议使用完整的字节或单词而不是字符串。

以 256 为基数而不是 10 为基数相对容易思考,并且处理器不一直执行乘法和除以 10 的效率要高得多。理想情况下,选择一个为处理器自然字长一半的字长,因为这样便于实现携带。当然,考虑 base 64K 或 4G 稍微复杂一些,但比 base 256 还要好。

唯一的缺点是从 ascii 输入生成初始大数字,您可以免费获得以 10 为底的数字。使用更大的字长,您可以通过将多个数字最初处理成一个单词来提高效率(例如一次将 9 位数字转换为 4G),然后将该单个字长乘以大整数格式的正确偏移量。

折衷方案可能是以 10 亿为底运行引擎:这仍将比使用 10 为底的效率高 9 或 81 倍!

求解这个等式的最简单方法是将 a/b * d/d 和 c/d * b/b 相乘,这样它们都有共同的分母 b*d。

我认为你需要对你的大数 e 和 f 进行质因式分解以找到任何公因数。请记住再次搜索相同的平方因子。

当然,这意味着您必须编写一个生成素数的筛子。您只需要生成直到平方根或 e 和 f 的最小值的一半数字的因子。

您可以对 b 和 d 进行质因式分解以获得较低的初始分母,但无论如何您都需要在相加后再次执行此操作。

【讨论】:

    【解决方案2】:

    我认为解决这个问题的方法是把问题分开:

    1. 将输入数字处理为字符数组(即std::string

    2. 创建一个类,其中每个对象都可以存储一个 std::list(或类似的),它代表一个大数,并且可以对您的数据进行所需的算术运算

    3. 然后您就可以正常解决您的问题,而不必担心您的大量输入会导致溢出。

    Here's a webpage that explains how you can have such an arithmetic class(C++ 中的示例代码显示了加法)。

    一旦你有了这样一个算术类,你就不再需要担心如何存储数据或任何溢出。

    我的印象是,当您没有溢出问题时,您已经知道如何找到 GCD,但以防万一,here's an explanation of finding the GCD(带有 C++ 示例代码)。

    至于具体的数学题:

    // given formula: a/b + c/d = e/f
    // = ( ( a*d + b*c ) / ( b*d ) )
    
    // Define some variables here to save on copying
    // (I assume that your class that holds the
    //   large numbers is called "ARITHMETIC")
    ARITHMETIC numerator = a*d + b*c;
    ARITHMETIC denominator = b*d;
    ARITHMETIC gcd = GCD( numerator , denominator );
    
    // because we know that GCD(e,f) is 1, this implies:
    ARITHMETIC e = numerator / gcd;
    ARITHMETIC f = denominator / gcd;
    

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2010-11-27
      • 2014-01-17
      • 2023-03-09
      相关资源
      最近更新 更多