整数因子分解问题-递归与dp

整数因子分解问题-递归与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();
        }
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值