【问题标题】:Decompose integers larger than 100 digits [closed]分解大于 100 位的整数 [关闭]
【发布时间】:2013-10-17 10:58:14
【问题描述】:

XY 是大于 100 位的整数。找到整数P,它在[X, Y[ 范围内,并保证“最佳”素数分解(即具有最多唯一素数因子的分解)。

我所做的只是检查素数并分解范围内的每个数字并找到符合规则的数字。有没有其他方法可以做到这一点?

An example on small integers

编辑:

在上面的示例中,123456 被分解为
2^6 * 3^1 * 643^1,即2 * 2 * 2 * 2 * 2 * 2 * 3 * 643,但只有 3 个唯一因子。

虽然答案 123690 被分解为 6 ​​个独特的因素
2^1 * 3^1 * 5^1 * 7^1 * 19^1 * 31^1

【问题讨论】:

  • 在网上搜索“c++ big number library”,因为那里有很多。
  • X 和 Y 大于 100 位的目的可能是禁止您计算每个可能数字的分解。恕我直言,这里有趣的是找到一种不需要这种计算的算法。
  • 我开始写答案,但找不到精确的算法。我的想法是反过来。类似尝试P = 2*2*2*....*2。如果它在 X 和 Y 之间,你就赢了。否则,试试P = 2*2*2*.... *3 等。递归地尝试所有可能的乘法与尽可能小的数字。
  • 这个问题似乎是题外话,因为它是关于数论的。
  • 这个问题似乎是题外话,因为它是关于数论,而不是编程。

标签: c++ c primes largenumber decomposition


【解决方案1】:

关于枚举素数问题的答案总是找到一种使用筛子解决问题的方法;就您而言,您正在寻找具有大量因子的“反素数”数,但该原理仍然适用。

这个问题的关键在于,对于大多数数字来说,大多数因素都很小。因此,我的建议是为 X 到 Y 的范围设置一个筛子,其中包含所有初始化为零的整数。然后考虑所有小于某个限制的素数,尽可能大,但显然比 X 小得多。对于每个素数,将 1 加到筛子的每个素数倍数的元素上。对所有素数进行筛选后,计数最多的筛选位置对应于 X 和 Y 之间具有最不同素因数的数。

让我们考虑一个例子:取范围 100 到 125 并用素数 2、3、5 和 7 进行筛选。你会得到这样的结果:

100 2 5
101 (101)
102 2 3 (17)
103 (103)
104 2 (13)
105 3 5 7
106 2 (53)
107 (107)
108 2 3
109 (109)
110 2 5 (11)
111 3 (37)
112 2 7
113 (113)
114 2 3 (19)
115 5 (23)
116 2 (29)
117 3 (13)
118 2 (59)
119 7 (17)
120 2 3 5
121 (11)
122 2 (61)
123 3 (41)
124 2 (31)
125 5

所以获胜者是 105 和 120,每个都有三个质因数;你必须自己决定如何处理领带。请注意,忽略了一些因素:11 除 110 和 121、13 除 104 和 117、17 除 102 和 119、19 除 114、23 除 115、29 除 116、31 除 124、37 除 111、41 除 123、53 106 整除,59 118 整除,61 122 整除,当然 101、103、107、109 和 113 是素数。这意味着 102、110 和 114 也并列领先,每个都具有三个主要因素。所以这个算法并不完美,但对于百位数范围内的 X 和 Y,假设你通过素数筛选到一百万或一千万,你不太可能会错过答案。

好问题。请尽快通过my blog 查找。

【讨论】:

  • 能否请给我反对票的人解释一下原因?如果我的回答有问题,我想修正它。
【解决方案2】:

按顺序 (2,3,5,7...) 取出所有素数的列表,然后开始将它们相乘 (2 * 3 * 5 *...) 直到得到一个数字 >= X。叫这个数字P'。如果它

对于一个小范围(YX很小),分配一个大小为Y-X+1的数组,将其归零,然后对于所有素数n >= X,那么这就是答案。如果不是,则继续筛选大于 Y-X 的素数,直到找到某个素数 p 使得 pn > X 用于表中的某个 n...

上述两种方法中的一种应该可以工作,具体取决于范围有多大......

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多