Java 如何利用循环求数的素因子分解?

Java 如何利用循环求数的素因子分解?,java,loops,variables,printing,Java,Loops,Variables,Printing,我应该找到这个数的素因子分解:600851475 根据我的老师和这个网站的说法,素数分解是素数乘以后得到的那个数。例如12,即使它的因子是2,3,4,6,基本因子也不仅仅是2和3,而是2,2,3 我已经有了找到素因子的算法,但是我找不到循环的方法,所以它会一直找到其余的,直到没有更多的素因子 这就是我得到的: public class primeFactors { public static void main(String[] args) { int d= 600851475; int i =

我应该找到这个数的素因子分解:600851475

根据我的老师和这个网站的说法,素数分解是素数乘以后得到的那个数。例如12,即使它的因子是2,3,4,6,基本因子也不仅仅是2和3,而是2,2,3

我已经有了找到素因子的算法,但是我找不到循环的方法,所以它会一直找到其余的,直到没有更多的素因子

这就是我得到的:

public class primeFactors {
public static void main(String[] args) {
int d= 600851475;
int i = 2;
if (d%i!=0) {i++;}
if (d%i==0) {d=d/i;}
System.out.println(i);
}
}
它打印了这个:3

如果我复制粘贴多次,它会打印不同的内容:

public class primeFactors {
public static void main(String[] args) {
int d= 600851475;
int i = 2;
if (d%i!=0) {i++;}
if (d%i==0) {d=d/i;}
System.out.println(i);

if (d%i!=0) {i++;}
if (d%i==0) {d=d/i;}
System.out.println(i);

if (d%i!=0) {i++;}
if (d%i==0) {d=d/i;}
System.out.println(i);

if (d%i!=0) {i++;}
if (d%i==0) {d=d/i;}
System.out.println(i);
}
}
那个打印:3,3,4,5,5。
如何使用循环执行此操作?我尝试过使用do while循环do{if section}而d>I{print I},但它不起作用。我还尝试了for循环I=2;由于这是一个作业,我给你的最多是一个大致的指导:写这篇文章最简单的方法是尝试候选除数并减少。例如:

130-尝试2,它会分开,所以减少 65-可能还有另外两个?再试一次。它不会分开,所以继续前进 65号-试试3号-4号?5号?是的,它分开了,所以减少。 13-里面还有5个吗?不,试试6,7,8,9,10,11,12。好了,你完了

所以你需要在一个循环中尝试候选除数,你需要一个内循环来确保你排除了任何重复的因子,例如,525将有素数因子3,5和7,但你仍然想去掉第二个5。这会让你走上正轨

显然,会有更有效的方法来写这篇文章,但是如果你陷入困境,从最简单可行的事情开始,并让它发挥作用

尝试使用for循环

for (int i = 2; i <= d; i++)
{
  //implement if statement here
}

这将为您指明正确的方向。

您只需要这样的东西,也许这不是最有效的方法,但它非常直截了当,更容易理解:

int d= 600851475;

for (int i = 2 ; i < (d / 2) ; i++){
    if(isPrime(i)){
        if(d % i ==0){
            System.out.println(i + "Is a prime factor of " + d);
        }
    }
}
但是首先你需要有这个方法来检查它是否是素数

public static boolean isPrime(int n){
    for(int i = 2 ; i < n ; i++){
        if(n % i == 0){
            return false; 
        }
    }
    return true;
}

你的想法是对的。你需要将每个因子分开,直到它不再分开

// this will print all prime divisors for n
for (int i = 2; n != 1; i++)
{
    while (n % i == 0)
    {
        System.out.println (i);
        n /= i;
    }
}

如何求一个数的素因式分解

以下是我尝试过的:

def p_分解n: 寻找n的因子。 num=[i代表范围1中的i,如果n%i==0,则n+1] 求n的素因子。 现在prime_num检查36的任何一个因子是否有两个以上的子因子。
prime_num=[i表示范围2中的i,如果len[j表示范围1中的j,如果i%j==0,则i+1]我刚刚看到了你剩下的答案,对不起。我确实需要复制的5之类的东西,因为我的老师说素数因子都可以乘以那个数,比如12:2,2,3,因为它都是12。我想我可以只留下2和3,但是没有。你仍然推荐内环吗?当然,唯一的区别是你现在保留了跟踪你找到了多少个5s。也许你正在将它们添加到你将要返回的因子列表中,或者你在找到它们时将它们打印出来-无论哪种方式,你都必须找到它们,而内部循环将为你做到这一点。你能给我解释一下候选除数循环吗?你正在寻找素数因子对于一些数字d。每个小于d的数字i都是一个潜在的因子。您将尝试每个i,从2开始,直到i大于d。如果i是d的除数,您将收集i打印出来,或将其添加到列表中,然后将d除以i,然后在新的d上再次尝试i。请注意,有一个外循环增加i,还有一个内循环增加i减少d。这两个都是while循环,但是它们的条件会有很大的不同。你应该能够从这个描述中得出这些条件是什么。另一件事:你应该试着向自己证明,这将找到所有且只有素因子。寻找这个证明可能会帮助你理解如何使用wr这就是你需要的代码。如果你边走边减少d,就没有必要检查isPrime,因为你会在找到它们的时候删除素数。很明显,任何组合都比它的任何素数因子都大,对吧?@JonKiparsky在我的方法中我没有减少d。但是,是的,我想这种技术会对你的素数列表做很多不必要的检查s乘以n,那么你要找的术语是素因子分解。525的素因子是3,5和7。525的素因子分解是3*5*5*7。谢谢!我会编辑它。你能再解释一下吗?我的程序说printfjava.lang.String方法,int对于primefactors类型是未定义的这个算法,你需要把数字分成几次,或者说,如果2是因子3次,你会得到2和4作为因子。我们知道当数字为1时我们就完成了,因为没有其他数字可以把它分开。这个算法总是会产生素数,因为在得到更大的合成因子之前,它会排除所有的小素数。关于printf,我实际上是指系统
.out.println;printf是一种不同的语言。至于循环,while循环就像一个if语句,它在代码之后反复执行,直到它的语句不再为true为止。for循环只是一个while循环,每个循环的开头和结尾各有一个表达式。对于int i=2;n!=1.i++{do_something;}与int i=2完全相同;而n!=1{do_something;i++}我试过了,效果很好。我会设法使它适应我的代码,因为我向老师展示了我以前的过程。感谢循环解释,它真的很有帮助!