分析:
方法一,利用循环,将数进行分解,直到变为1。
方法二,可以根据公式f(n) = k * f(n / k)建立递归,采用记忆化递归减少重复计算。
Java代码实现:
方法一:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int i,j,k;
for(i = a; i <= b; i++) { //从a到b,for循环用来遍历每一个数
j = 1;
k = i; //将值赋给k,不改变i
System.out.print(k + "=");
while (k != 1) { //while循环用来求因子
j++;
if (k % j == 0) { //找到一个因子,就将原数除以这个因子。再次循环,直到k为1
k /= j;
if (k == 1) {
System.out.print(j); //最后没有乘号
} else {
System.out.print(j + "*");
}
j = 1;
}
}
System.out.println();
}
}
}
方法二:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int begin, end;
begin = input.nextInt();
end = input.nextInt();
items = new String[end + 1];
fun(begin, end);
}
private static void fun(int begin, int end) {
for (int i = begin; i <= end; i++) {
System.out.print(i + "=");
builder = new StringBuilder();
decomposition(i);
System.out.println(builder.toString());
}
}
//记忆化递归
private static String[] items;
private static StringBuilder builder;
private static void decomposition(int n) {
if (items[n] != null) {
builder.append(items[n]);
}
//找到第一个能够分解的素数就停止循环
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
builder.append(i + "*");
decomposition(n / i);
return ;
}
}
builder.append(n);
return ;
}
}
方法二所用的内存和耗时都比方法一的少。