题目:将一个正整数n分解质因数。例如:50=2*5*5
* 思路描述:
* 1、如果n是质数,就直接结束,打印出来就好
* 2、如果i能整除n,就打印i,然后更新n = n / i;递归
* 3、如果i不能整除n,就i++
// 递归实现
public static void solve1(int n) {
for (int i = 2; i <= n; i++) {
if (i == n) {
System.out.print(i);
return;
}
if (n > i && (n % i == 0)) {
System.out.print(i + "*");
solve1(n / i);
break;
}
}
}
// 非递归实现
public static void solve2(int n) {
List<Integer> list = new ArrayList();
for (int i = 2; i <= n; i++) {
while (n != i) {
if (n % i != 0) {
break; // 仔细品味一下
}
list.add(Integer.valueOf(i));
n = n / i;
}
}
list.add(n);
for (int i = 0; i < list.size() - 1; i++) {
System.out.print(list.get(i) + "*");
}
System.out.println(list.get(list.size() - 1));
}
// 基于Eratosthenes筛法,要是n不是素数,那么n的的素数小于等于n开根号
public static void solve3(int n) {
int i = 2;
while (i * i <= n) {
while (n % i == 0) {
System.out.print(i + "*");
n = n / i;
}
i++;
}
if (n > 1)
System.out.println(n); // n本身就是质数
}
源代码及测试
import java.util.ArrayList;
import java.util.List;
public class Main {
// 递归实现
public static void solve1(int n) {
for (int i = 2; i <= n; i++) {
if (i == n) {
System.out.print(i);
return;
}
if (n > i && (n % i == 0)) {
System.out.print(i + "*");
solve1(n / i);
break;
}
}
}
// 非递归实现
public static void solve2(int n) {
List<Integer> list = new ArrayList();
for (int i = 2; i <= n; i++) {
while (n != i) {
if (n % i != 0) {
break; // 仔细品味一下
}
list.add(Integer.valueOf(i));
n = n / i;
}
}
list.add(n);
for (int i = 0; i < list.size() - 1; i++) {
System.out.print(list.get(i) + "*");
}
System.out.println(list.get(list.size() - 1));
}
// 基于Eratosthenes筛法,要是n不是素数,那么n的的素数小于等于n开根号
public static void solve3(int n) {
int i = 2;
while (i * i <= n) {
while (n % i == 0) {
System.out.print(i + "*");
n = n / i;
}
i++;
}
if (n > 1)
System.out.println(n); // n本身就是质数
}
public static void main(String[] args) {
solve1(100);
System.out.println();
solve2(75);
solve3(50);
}
}
结果: