分解大于 100 位的整数
Decompose integers larger than 100 digits
X
和Y
是大于 100 位的整数。找到在 [ X
, Y
[ 范围内并保证"最佳"素分解(即具有最唯一素因数的分解(的整数P
。
我所做的只是检查素数并分解范围内的每个数字,然后找到遵守规则的数字。还有其他方法可以做到这一点吗?
关于小整数的示例
编辑:
在上面的示例中,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
.
关于枚举素数的问题的答案总是找到一种使用筛子解决问题的方法;在您的情况下,您正在寻找具有大量因子的"反素数"数,但该原则仍然适用。
这个问题的关键是,对于大多数数字来说,大多数因素都很小。因此,我的建议是为 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,假设你用素数筛选到一百万或一千万,你不太可能错过答案。
问得好。尽快在我的博客上寻找它。
按顺序(2,3,5,7...(列出所有素数,然后开始乘以它们(2 * 3 * 5 *...(,直到得到一个数字>= X。 称此号码为 P'。 如果它的 <= Y,你就完成了,P = P'。 如果没有,则开始计算 P'/2、P'/3、P'/5 等,寻找一个数字 [X,Y]。 如果你没有找到它并得到一个数字
对于较小的范围(Y-X 很小(,分配一个大小为 Y-X+1 的数组,将其归零,然后对于所有素数 <= Y-X,将一个添加到对应于素数倍数的数组元素中(简单 seive(。 然后搜索总数最大的元素。 如果总 n 是这样的 (Y-X(n>= X,那么这就是答案。 如果没有,请继续筛选大于 Y-X 的素数,直到你得到一些素数 p,使得表中某个 n 的 pn> X ...
上述两种方法之一应该有效,具体取决于范围有多大......
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 如何找到大于整数的最小数字
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- 如何在 c++ 中解析包含整数的字符串并检查是否大于最大值
- 从C 中的系统函数中获取整数(大于255)
- 在整数中存储大于 INT_MAX 的数字
- 如何乘以大于 uint64 的整数
- 查找大于或等于 x(正整数)z 倍数(正整数,可能是 2 的幂)的最小整数
- 如何返回小于或等于平均值的整数和大于平均值的整数
- 分解大于 100 位的整数
- 大于无符号长整型的整数类型,以及库
- 如何在C++中保存大于 64 位的整数
- 检查输入是否为整数或大于零
- 我如何从一个8位整数中得到一个大于8位的值
- 如何将一个整数除以另一个大于零的数并给出余数
- 在 32 位 Windows 上大于 4294967295 的整数