Java显示一个数的质因数分解

8

我的任务是编写一个程序,要求用户输入一个整数,然后打印出该数字的质因数分解。

import java.util.Scanner;

public class PrimeFactor {
    public static void main(String[] args) {
        System.out.print("Enter a positive number: ");
        Scanner scanner = new Scanner (System.in);
        int number = scanner.nextInt();
        int count;
        for (int i = 2; i<=(number); i++) {
            count = 0;
            while (number % i == 0) {
                number /= i;
                count++;
                if (count == 0) {
                    continue;
                }
            }
            System.out.println(i+ "**" + count);
        }
    }
}

我现在遇到的问题是,每当我使用像15453这样的数字运行它时,我会得到从1到100的每个因子及其指数的列表,而我只想要质因数,并且我不知道该如何继续。


你能使用递归、函数和库类吗?只需要了解在这里允许使用什么。 - thatidiotguy
4
那个 continue 语句不会经常被执行... - Keppil
7个回答

4
你已经快完成了!将 if-continue 块移到 for 循环外部。否则,它会 "继续" 最内层的循环,而不是你想要的那一个。
while (number % i == 0) {
    number /= i;
    count++;
}
if (count == 0) {
    continue;
}
System.out.println(i+ "**" + count);

或者,您可以将System.out.println调用封装在if (count != 0)中,因为它是紧随continue后唯一的语句:

while (number % i == 0) {
    number /= i;
    count++;
}
if (count != 0) {
    System.out.println(i+ "**" + count);
}

您的程序在ideone上:链接

2
public class _03_LargestPrimeFactor {

public static void main(String[] args) {

    long a = 600851475143L;

    for(int i=2; i<(a/i); i++){                         // no factors would exist beyond a/i for a particular i

        while( a%i == 0){                               // if i is a factor 
            a = a/i;                                    // divide a by i else we wont get a prime number
            System.out.print(a + " x " + i + "\n");
        }
    }

    if(a > 1)
    System.out.println("largest prime factor: " + a);
}

}

控制台:

8462696833 x 71

10086647 x 839

6857 x 1471

最大质因数:6857


explain it in detail - Muhammad Muazzam

1

首先,你的continue语句在while循环内部,没有任何作用。最简单的修复方法是

public class PrimeFactor {
    public static void main(String[] args) {
        System.out.print("Enter a positive number: ");
        Scanner scanner = new Scanner (System.in);
        int number = scanner.nextInt();
        int count;
        for (int i = 2; i<=(number); i++) {
            count = 0;
            while (number % i == 0) {
                number /= i;
                count++;
            }
            if (count == 0) {
                 continue;
            }
            System.out.println(i+ "**" + count);
        }
    }
}

但是你还有其他问题:

  • 你的代码没有正确的“分解”(具体来说,这意味着它没有被分解为函数)
  • 变量名选择不当
  • 在只需要使用if语句时,你使用了goto(在这种情况下是continue)

更好的代码应该是:

public class PrimeFactor {
    public static void main(String[] args) {
        System.out.print("Enter a positive number: ");
        Scanner scanner = new Scanner (System.in);
        printFactors(scanner.nextInt());
    }
    public static void printFactors(int product) {
        for (int factor = 2; factor <= product; factor++) {
            int exponent = 0;
            while (product % factor == 0) {
                product /= factor;
                exponent++;
            }
            if (exponent > 0) {
                System.out.println(factor+ "**" + exponent);
            }
        }
    }
}

0

不确定为什么要打印两次乘法!这是已经优化过的代码:

public static void printPrimeNumbers(int prime) {

    int n;

    for (int i = 2; i <= prime; i++) {
        n = 0;
        while (prime % i == 0) {
            prime /= i;
            n++;

        }

        if (n != 0) {
            for (int j = n; j > 0; j--) {
                System.out.print(i);

                if (prime != 1) {
                    System.out.print("*");
                }
            }
        }
    }
}

0
你已经接近成功:
  1. System.out.println 语句必须在你的 for 循环内,并且只显示 count>0 的值。
  2. 删除 if(count == 0) { continue; },它是无用的,因为你刚刚增加了 count

0
你还可以从下面的函数中获得一些帮助。
public int getPrimeNumber(double number) {
    int j = 0;
    while (number % 2 == 0) {
        number = number / 2;
        j = 2;
    }

    for (int i = 3; i <= number; i = i + 2) {
        while (number % i == 0) {
            number = number / i;
            j = i;
        }
    }

    return j == 0 ? 1 : j;
}

这个函数将返回给定数字的最大质因数。


-1
从 while 循环中删除 if (count == 0) {continue;} 语句,并将其放在 for 循环之后。 :)
for (int i = 2; i<=(number); i++) {
        count = 0;
        while (number % i == 0) {
            number /= i;
            count++;
        }
        if(count==0) continue;
        System.out.println(i+ "**" + count);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接