整数因子分解问题-递归与dp
递归思想:因为整数n的分解方式等于除本身外所有因子可分解种类的总和。需要对所有因子进行递归搜索,递归出口为n等于1,仅有一种分解情况,就是本身。
动态规划思想:用一维数组记录因子的分解种类数,dp方程式:dp[i] = dp[j1] + dp[j2] + … ,其中j1,j2…为i的因子。
方法1:递归(键盘输入,控制台输出方式)
import java.util.Scanner;
public class IntegerFactor {
static int total = 0;
public static void solve(int n){
if(n == 1){
total ++ ;
}else{
for(int i=2; i<=n; i++){
if(n % i == 0){ //对所有n的因子进行递归搜索
solve(n/i) ;
}
}
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
solve(n) ;
System.out.println(total);
}
}
方法1:递归(文件流输入输出方式)
import java.io.*;
public class IntegerFactor {
static int total = 0;
static String line ;
static int n ;
public static void solve(int n){
if(n == 1){
total ++ ;
}else{
for(int i=2; i<=n; i++){
if(n % i == 0){ //对所有n的因子进行递归搜索
solve(n/i) ;
}
}
}
}
public static void main(String[] args) {
try (FileInputStream input = new FileInputStream("D:\\study\\input.txt");
DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(input))){
line = dataInputStream.readLine() ;
n = Integer.parseInt(line) ;
solve(n);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
try ( FileOutputStream output = new FileOutputStream("D:\\study\\output.txt");
DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(output))){
dataOutputStream.writeBytes(total+ "\n");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
方法2:动态规划(键盘输入,控制台输出方式)
import java.util.Scanner;
public class IntegerFactor1 {
/**方程式:dp[i] = dp[j1] + dp[j2] + ...
* 其中j1,j2...为i的因子
*/
public static int f(int n, int [] dp){
for(int i=1; i<=n; i++){
if(i == 1){
dp[i] = 1 ;
}else {
for (int j = 1; j < i; j++) {
if (i % j == 0) {
dp[i] += dp[j];
}
}
}
}
return dp[n] ;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt() ;
int [] dp = new int [n+1] ;
System.out.println(f(n, dp));
}
}
方法2:动态规划(文件流输入输出方式)
import java.io.*;
/**方程式:dp[i] = dp[j1] + dp[j2] + ...
* 其中j1,j2...为i的因子
*/
public class IntegerFactor3 {
private static String line ;
private static int n ;
public static int f(int n, int [] dp){
for(int i=1; i<=n; i++){
if(i == 1){
dp[i] = 1 ;
}else {
for (int j = 1; j < i; j++) {
if (i % j == 0) {
dp[i] += dp[j];
}
}
}
}
return dp[n] ;
}
public static void main(String[] args) {
try (FileInputStream input = new FileInputStream("D:\\study\\input.txt");
DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(input))){
line = dataInputStream.readLine() ;
n = Integer.parseInt(line) ;
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
try ( FileOutputStream output = new FileOutputStream("D:\\study\\output.txt");
DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(output))){
int [] dp = new int [n+1] ;
dataOutputStream.writeBytes(f(n, dp)+ "\n");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}