Java中的素因子分解

Java中的素因子分解,java,prime-factoring,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 =

我正在用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+ ", ");
            }
        }
    }
}
公共静态空隙系数(int a)
{
int c=1;

对于(int i=1;i您可以使用另一个集合来维护因子及其计数,并最终解释重复因子。我可以选择一个包含计数的映射。

我认为您应该重新开始,并根据以下简单描述构建算法:

  • 准备一份小于或等于2^16的素数的
    列表
  • 从低到高遍历此列表,依次尝试每个素数作为候选除数
  • 每次你遇到一个有效的除数,不断地把它除掉,直到你不能再把这个数除以它;然后继续到下一个素数
  • 一旦到达素数列表的末尾,还应打印剩余的数字,除非它等于
    1

查找素数列表本身是一个有趣的问题。Dijkstra在1972中写了一个引人入胜的章节。它有C++实现和很好的讨论。

< P>(1)<代码>(C=0=i=2)< /C>是错误的,它将打印<代码> 2 < /C> > <代码> A==5 < /COD>。< /P> (2) 为了在不更改代码(*)的情况下完成要求的操作,您应该计算每个素数因子可被数字整除的次数。只需在打印语句[伪代码]之前添加一个新循环即可:

boolean b = true;
int k = 1;
while (b) { 
  if (a % (int) Math.pow(i, k+1) == 0) k++;
  else b = false;
}
在这个循环的末尾,k表示
i
a
的主要因子的次数


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

继续划分因素,直到无法再划分为止。这些因素是否重复并不重要。你确定你的问题需求被正确理解了吗。通常,你要么列出所有因素(所以12应该是1,2,3,4,6,12)或者你将其分解(所以12应该是2,2,3)。你似乎想做的是介于两者之间的一些奇怪的事情。这是家庭作业吗?如果是,请将问题标记为这样。还有,“不完全重组”是什么意思?