Java中的Prime分解

时间:2012-03-24 19:19:10

标签: java prime-factoring

我正在开发一个Java中的素数分解程序,它显示数字的所有素因子,即使它们被重复。我有这个:

public static void factors(int a)
{
    int c=1;
    for(int i = 1; i <= a;i++)
    {
        if(a%i == 0)
        {
            for(int k = 2; k < i; k++)
            {
                if(i%k == 0)
                {
                    c = 1;
                    break;
                }
                else
                {
                    c = 0;
                }
            }
            if(c == 0 || i == 2)
            {
                System.out.print(i+ ", ");
            }
        }
    }
}

我需要考虑重复的因素(如2,2,2,8)。如果不完全重组,我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

我认为你应该重新开始,并根据这个简单的描述构建一个算法:

  • 准备List<Integer>小于或等于2 ^ 16
  • 的素数
  • 从低到高运行此列表,依次尝试每个素数作为候选除数
  • 每当你遇到一个有效的除数时,不断将它除去,直到你再也不能将它除去;然后继续下一个素数
  • 一旦到达素数列表的末尾,您的剩余数字也应该打印出来,除非它等于1

查找素数列表本身就是一个有趣的问题。 Dijkstra在1972年写了一篇引人入胜的章节。This article有一个C ++实现和一个非常好的讨论。

答案 1 :(得分:0)

您可以拥有另一个维护因子及其数量的集合,并最终可以解释重复因素。我会选择带有计数的地图。

答案 2 :(得分:0)

(1)if(c == 0 || i == 2)错误,它也会为2打印a == 5

(2)为了在不改变代码(*)的情况下做你要求的事情 - 你应该计算每个素因子可以被数字分成多少次。可以通过在print语句之前添加一个新循环来实现[伪代码]:

boolean b = true;
int k = 1;
while (b) { 
  if (a % (int) Math.pow(i, k+1) == 0) k++;
  else b = false;
}

在此循环结束时,k表示ia的主要因素的次数。

(*)注意:虽然这种方法应该有效,但我仍然会将@KerrekSB建议重新设计。