带分数

带分数

问题描述
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

思路分析:

求出0~9的全排列,然后对所有的全排列进行筛选。符合条件的排列对a,b,c划分处理,如果满足target== a+b/c且b%c==0,同时abc包含所有(0-9,且不重复)则将记录种数count+1

本文思路参考:https://blog.csdn.net/jopus/article/details/18998403

本文代码参考https://blog.csdn.net/wzhworld/article/details/69491219?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162765673416780274190030%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162765673416780274190030&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-4-69491219.first_rank_v2_pc_rank_v29&utm_term=Java带分数&spm=1018.2226.3001.4187

代码实现

import java.util.Scanner;

public class MixedNumber{
    static int count = 0;
    static int[] array = new int[10];
    static int[] flag = new int[10];

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int target = scanner.nextInt();
        Prim(1,10,target);
        System.out.println(count);
    }

    //对1~9全排序
    public static void Prim(int start,int end,int target){
        if (start == end){ //递归结束标志
            Judge(array,end,target);
        }else {
            for (int i = 1; i < end; i++) {
                if (flag[i] == 1)
                    continue;
                    array[start] = i;
                    flag[i] = 1;
                    Prim(start + 1,end,target); //下一位
                    flag[i] = 0;
            }
        }
    }

    //判断全排列的结果是否符合要求
    public static void Judge(int array[],int end,int target){
        for (int i = 1; i < end; i++) {
            int a = traslationNumber(0,i);  //第一个数
            if (a >= target) //第一个数不能大于target
                return;
            for (int j = i + (end - i) / 2; j < end - 1; j++) {
                int b = traslationNumber(i,j); //第二数
                int c = traslationNumber(j,end - 1); //第三个数
                if ( b > c && b % c == 0 && target == a + b /c){
                    count++;
                }
            }
        }
    }

    //将数组区间转换成数字
    public static int traslationNumber(int start,int end){
        int number = 0;
        for (int i = start; i < end; i++) {
            number = array[i+1] + number  * 10; //进位
        }
        return number;
    }

}

运行结果
请添加图片描述
请添加图片描述

posted @ 2021-07-31 01:05  小芦荟同学  阅读(793)  评论(0编辑  收藏  举报