帶分數
問題描述
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
代碼實現
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;
}
}
運行結果