帶分數


帶分數

問題描述
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=%7B%22request%5Fid%22%3A%22162765673416780274190030%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&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;
    }

}

運行結果
請添加圖片描述
請添加圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM