带分数
试题 带分数
问题描述
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
代码①(全排列):
import java.util.Scanner;
public class 带分数 {
private static Scanner sc;
private static int n,result;
public static void main(String[] args) {
sc = new Scanner(System.in);
n = sc.nextInt();
sc.close();
int[] data= {1,2,3,4,5,6,7,8,9};//九个数的排列方法
allsort(data,0);
System.out.println(result);
}
private static void allsort(int[] data, int i) {
// TODO Auto-generated method stub
if(i==data.length) {
for(int j=1;j<data.length;j++) {
//对挑选出来的k-j个数字进行组合枚举出来,枚举三个,然后拿这三个书进行带分数公式来检验
for(int k=j+1;k<data.length;k++) {//在每种整数占位方法的基础上,列举分数的占位方法
int pre=split(data,0,j);
int mid=split(data,j,k);
int fon=split(data,k,9);
if(mid%fon!=0) //如果分数值已经大于输入数据,后面占位方法也肯定是大于的,直接结束
continue;
if(pre+mid/fon==n)//如果结果与输入数据相等,有效排列+1
result++;
}
}
return;
}
for(int j=i;j<data.length;j++) {
int temp=data[j];
data[j]=data[i];
data[i]=temp;
allsort(data,i+1);//递归
temp=data[j];
data[j]=data[i];
data[i]=temp;
}
}
private static int split(int[] data, int j, int k) {//列举所有全排列
// TODO Auto-generated method stub
int num=0;
for(int i=j;i<k;i++) {
num=data[i]+num*10;
}
return num;
}
}
全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
解法1(递归)
解法2(字典序法)
解法参考:https://blog.csdn.net/u013309870/article/details/68941284