我想将这个数字分解为这个数字中最大的正方形和其他数字的乘积,但我在某些时候陷入困境。我真的很感激一些建议。这就是我到目前为止所做的:
我在输入上取数字,将因子分解为素数,并将素数序列放到ArrayList中。在某种意义上,数字被排序,因此序列中的数字正在增加。
例如,
996 is 2 2 3 83
1000 is 2 2 2 5 5 5
100000 is 2 2 2 2 2 5 5 5 5 5
我现在的想法是计算序列中每个元素的出现次数,因此如果出现的次数可以被2整除,那么这就是正方形。
通过这种方式,我可以获得另一个序列,其中最可被2整除的元素是最大的正方形。
计算ArrayList
中出现次数的最有效方法是什么?或者有没有更好的方法来找到最大的广场?
答案 0 :(得分:4)
天真(暴力)解决方案:
生成小于给定数字的正方形列表,然后迭代此列表,检查条目是否除以给定数字。找到除数时停止,这就是答案。
您也可以调整此项以生成候选人列表,而不是一次性生成。从楼层开始(sqrt(给定))并递减,直到找到正方形为除数的东西。
更类似于您的计划:
对数字进行因子分析,并建立素数因子及其多重性的映射作为因子。
浏览地图并将所有奇数乘数减少一个。
将地图中的所有数字乘以调整后的多重性。
答案 1 :(得分:3)
没有必要构建一个数组来执行此操作。您可以随意构建正方形,就像在这个伪代码(又名Python)中一样:
from math import sqrt
def sqrfact(n):
lim = sqrt(n) + 1
x = 2
while x <= lim:
if n % x == 0:
p = n/x
if p % x == 0:
return (x ** 2) * sqrfact(p/x)
else:
return sqrfact(p)
x += 1
# No factors.
return 1
根据您输入的数字类型,这可能比蛮力稍快。
答案 2 :(得分:1)
您是否有义务在自然数上使用算法?
你不能取数字的平方根并截断它?
即trunc(squareRoot(10001))= 100 =最大平方