带分数(深搜+全排列)

问题描述

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。
输入格式

从标准输入读入一个正整数N (N<1000*1000)
输出格式

程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6

求解:

import java.util.Scanner;

/** 
 * @author 作者 : Cactus
 * @version 创建时间:2018-3-26 上午07:47:23 
 * 深搜+全排列
 */
public class Main {
    private static int N,count = 0;
    private static int[] arrFlag = new int[10];
    private static int[] arrNum = new int[10];
    static int q = 0;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        sc.close();
        dfs(1);
        System.out.println(count);
    }
    private static void dfs(int deep){ //深搜
        if(deep == 10){
            check(); //完成一套排列组合则检查一下
        }else{
            for(int i = 1; i <= 9; i++){ 
                if(arrFlag[i] == 0){
                    arrFlag[i] = 1;
                    arrNum[deep] = i;
                    dfs(deep+1); 
                    arrFlag[i] = 0;
                    arrNum[deep] = 0;
                }
            }
        }
    }
    /**
     * 深搜过程如下:
     * 1 2 3 4 5 6 7 8 9
     * 检查,然后回退,再赋值
        1 2 3 4 5 6 7 9 8 
        1 2 3 4 5 6 8 7 9 
        1 2 3 4 5 6 8 9 7 
        1 2 3 4 5 6 9 7 8 
        1 2 3 4 5 6 9 8 7 
        1 2 3 4 5 7 6 8 9 
        1 2 3 4 5 7 6 9 8 
        1 2 3 4 5 7 8 6 9 
        1 2 3 4 5 7 8 9 6 
        1 2 3 4 5 7 9 6 8 
        1 2 3 4 5 7 9 8 6 
        1 2 3 4 5 8 6 7 9 
        1 2 3 4 5 8 6 9 7 
        1 2 3 4 5 8 7 6 9 
        1 2 3 4 5 8 7 9 6 
        1 2 3 4 5 8 9 6 7 
        1 2 3 4 5 8 9 7 6 
        1 2 3 4 5 9 6 7 8 
        1 2 3 4 5 9 6 8 7 
        1 2 3 4 5 9 7 6 8 
        ......
     */
    private static void check(){
        for(int i = 1; i <= 8; i++){
            int a = sum(1,i); //得到第一个整数
            if(a >= N){
                return;
            }
            for(int j = i + 1; j < 9; j++){
                int b = sum(i + 1, j); //得第二数的分子
                int c = sum(j + 1, 9); //得第二数的分母
                if(c == 0){
                    continue;
                }
                if(b > c && b % c == 0 && N == a + b / c){ //判断条件
                    count++;
                }
            }
        }
    }
    private static int sum(int a, int b){// 根据arrNum中的部分数值,得到对应的整数
        int sum = 0;
        for(int i = a; i <= b; i++){
            sum = sum * 10 + arrNum[i];
        }
        return sum;
    }
}

猜你喜欢

转载自blog.csdn.net/cactus_lrg/article/details/79702141
今日推荐