-题目
标题:带分数
100 可以表示为带分数的形式:100 = 3 + 69258 / 714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
例如:
用户输入:
100
程序输出:
11
再例如:
用户输入:
105
程序输出:
6
- 代码
import java.util.Arrays;
import java.util.Scanner;
public class MixedNumber {
static int[] a = new int[9];
static int[] used = new int[9];
static int cnt = 0;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
permution(0, 9, N);
System.out.println(cnt);
}
//N<1000*1000
static boolean check(int N, String s) {
int len = 0;
int[] res = {12,123,1234,12345,123456,1234567};
for(int i=0;i<res.length;++i) {
if(N<res[i]) {
len = i+1;
break;
}
}
for(int i=1;i<=len;++i) {
int m = Integer.parseInt(s.substring(0,i));
for(int j=1;j<=8-i;++j) {
int n = Integer.parseInt(s.substring(i,i+j));
int p = Integer.parseInt(s.substring(i+j,9));
if(n%p==0 && m+n/p==N) {
return true;
}
}
}
return false;
}
static void permution(int pos, int n, int N){
if(pos==n) {
String s = Arrays.toString(a).replaceAll("\\[|\\]|,| ", "");
if(check(N, s)) {
cnt++;
}
return ;
}
for(int i=1;i<=n;++i){
if(used[i-1]==0){
a[pos] = i;
used[i-1] = 1;
permution(pos+1, n, N);
used[i-1] = 0;
}
}
}
}
- 结果
105
6
- 输出算式
//s为合法的排列组合字符串
for(int i=1;i<=len;++i) {
int m = Integer.parseInt(s.substring(0,i));
for(int j=1;j<=8-i;++j) {
int n = Integer.parseInt(s.substring(i,i+j));
int p = Integer.parseInt(s.substring(i+j,9));
if(n%p==0 && m+n/p==N) {
StringBuilder b = new StringBuilder(s);
b.insert(i," + ");
b.insert(i+j+3," / ");
b.insert(0, N+" = ");
System.out.println(b.toString());
}
}
}
- 输出算式
105 = 72 + 6534 / 198
105 = 87 + 3456 / 192
105 = 87 + 9612 / 534
105 = 92 + 5681 / 437
105 = 92 + 6734 / 518
105 = 98 + 3647 / 521