100可以表示为带分数的形式:100 = 3 + 69258 / 714;还可以表示为:100 = 82 + 3546 / 197。注意要求:带分数中,数字1---9分别出现且只出现一次(不包含0)。
类似这样的带分数,100有11种表示法。
【输入格式】
仅1行,要表示的数N
【输出格式】
仅一行,表示N有几中符合要求的表示方法
【样例输入】
100
【样例输出】
11
【评测样例规模】
N<1000*1000
/**
* @author quanran
* @create 2021-12-05 14:18
*/
public class MixNum {
public static void main(String[] args) {
Scanner ss = new Scanner(System.in);
System.out.println("请输入N");
int N = ss.nextInt();
//arg 用于后面判断 数字1---9分别出现且只出现一次
String[] arr = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"};
// 带分数必定满足公式 : N = i + ( t / j )
// i 不能包含0,从1开始,且小于N
// j 从2开始,j不会大于10000 因为 测试范围 N < 1000 * 1000
// “i” + “t” + “j” 如果他们转成成String然后拼起来 超过9位数 那多出来的数肯定会和前面的重复,不成立
// 而 t 是 (N - i) * j j的位数不能大过四位数!!!!!!!!
// 如果大于四位数,比如占了五位数,i又至少占一位数,那 t 就最多只能四位数了
// 五位数的j 跟 什么数相乘,都不会 得到 四位数的 t !!!!!!!!!!!
int count = 0; //最终结果,记录符合条件的个数
int t = 0;
String str = "";
for (int i = 1; i < N; i++) {
for (int j = 2; j < 10000; j++) {
//由公式 N = i + ( t / j )转换得 t
t = (N - i) * j;
// 把整个带分数 分位三个部分
str = "" + i + t + j;
//如果它的长度大于或者小于9,说明要么有数不全,要么有数重复,不符合条件
if (str.length() != 9) {
continue;
} else {
//如果yes为true,说明很yes,符合条件
boolean yes = false;
//经过上面的if语句,知道现在的 str 是符合九位数的
//现在来判断它有没有重复数,或者少了一个数
for (int k = 0; k < arr.length; k++) {
int tmp = str.indexOf(arr[k]);
//经历了一遍循环后,如果有其中一个数没找到,说明肯定不符合条件,会直接break
if (tmp == -1) {
yes = false;
break;
}
//如果都找到了,说明符合条件
yes = true;
}
if (yes) {
count++;
}
}
}
}
//最后输出结果
System.out.println(count);
}
}