如何找到数字中最大的平方(Java)

时间:2011-02-06 15:23:53

标签: java math arraylist primes

我想将这个数字分解为这个数字中最大的正方形和其他数字的乘积,但我在某些时候陷入困境。我真的很感激一些建议。这就是我到目前为止所做的:

我在输入上取数字,将因子分解为素数,并将素数序列放到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中出现次数的最有效方法是什么?或者有没有更好的方法来找到最大的广场?

3 个答案:

答案 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 =最大平方