X
和Y
是大于100位的整数。找到[P
,X
范围内的整数Y
[并保证“最佳”素数分解(即最强唯一的分解)主要因素)。
我所做的只是检查素数并分解范围内的每个数字,并找到符合规则的数字。还有其他办法吗?
在上面的例子中,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
。
答案 0 :(得分: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和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。
答案 1 :(得分:1)
按顺序获取所有素数列表(2,3,5,7 ...)并开始相乘(2 * 3 * 5 * ...),直到得到一个数字> = X.称此为数字P'。如果它的< = Y,你就完成了,P = P'。如果不是,则开始计算P'/ 2,P'/ 3,P'/ 5等寻找数字[X,Y]。如果你没有找到它并得到一个数字< X,尝试将下一个素数乘以P'并继续。如果这仍然失败,那么范围[X,Y]非常小,所以回到分算该范围内所有数字的方法。
对于小范围(YX很小),分配一个大小为Y-X + 1的数组,为零,然后对于所有素数< = YX,将一个数组元素添加到对应于素数的倍数(简单钛硅分子筛)。然后搜索总数最大的元素。如果总n是(Y-X) n > = X,那么这就是答案。如果没有,继续筛选大于Y-X的素数,直到得到一些素数p,使得p n > X表示表中的某些n ...
上述两种方法中的一种应该有效,具体取决于范围的大小......