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