2024/3/17打卡带分数(第四节蓝桥杯)——全排列dfs

目录

题目

思路

代码


题目

100 可以表示为带分数的形式:100=3+\frac{69258}{714}

还可以表示为:100=82+\frac{3546}{197}

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

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

输入格式

一个正整数。

输出格式

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

数据范围

1≤N<10^6

输入样例1:

100

输出样例1:

11

输入样例2:

105

输出样例2:

6

思路

        问题求 不重不漏使用 0~9 中的数组成 a,b,c 三个数,要满足 N = a+\frac{b}{c} 。

        可以理解为0~9 如何排列 划分可以满足上述条件。

解决方法:

        对 0~9进行全排列  全排列——dfs(剪枝/回溯)-CSDN博客   ,对每个排列好的数通过二重循环来划分成三部分 ,组成 a,b,c 三个数。验证枚举出来的三个数是否满足题干条件,若满足则计数。

代码

import java.util.*;

class Main{
    static int N = 1000010;
    static int n;
    static boolean[] st = new boolean[10]; // 对0~9在全排列过程中做标记
    static long l,res;
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        dfs(0); // dfs对0~9进行全排列
        System.out.println(res);
    }
    // 全排列
    public static void dfs(int k){ // k计数
        if(k==9){ //k==9,排列完成
            calculate(l); // 对l进行划分
            return;
        }
        
        for(int i=1;i<=9;i++){
            if(!st[i]){
                l = l*10+i; 
                st[i] = true;
                dfs(k+1);
                l = l/10;
                st[i] = false;
            }
        }
        return;
    }
    
    // 将排列的数划分成三部分,判断是否满足条件
    public static void calculate(long l){
        for(int i=1;i<=7;i++){// 第一部分只能从1~7(7:需要留两个作为后面两部分)
            for(int j=i+1;j<9;j++){
                long x = l/(int)(Math.pow(10,9-i));
                long a = (l%(int)Math.pow(10,9-i))/(int)Math.pow(10,9-j);
                long b = l%(int)Math.pow(10,9-j);
                if(a/b+x==n&&a%b==0) res++;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值