带分数
问题描述
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;
}
}
运行结果