100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
6
这道题的解题思路如下:
/*
* 由题目可知解题的公式是: i + (j / k) == n
* 这道题最大难点在于选择 j和k的范围,一般在程序设计题中,使用两个for循环尚且满足条件,一旦使用三个for循环,直接超时
* 由题目可以知道,数字1-9,不重复,这就证明了,我们要求的三个数,加起来的长度是9,长度不等于9直接不满足条件
* 第一个循环,我们先定义i的范围,首先 i肯定大于1,其次,i肯定小于 n - 1,因为 i, j , k 都是整数,所以(n - i)也是整数,
* (n - i) 最小的值是 1,这就说明,i < n - 1,所以 i的值的范围为 1 <= i < n - i;
* 在第二个for循环中,尽可能的缩小范围,由题目可知(n - i) >= 1,(j / k ) == (n - i),所以 (j / k) >= 1;
* k 的范围肯定小于等于 j 的范围,所以,第二个for循环,我们设为k的范围
* 最终获得 j = k * (n - i) ;
* 设L1:数字 i的长度
* 设L2:数字(n - i) 的长度
* L3:数字k的最大范围,Math.pow(10,L3),10的L3次方
* 本题中最大的难度在于确定k的范围,也就是L3的大小,数字j加上数字k 的长度等于 (9 - L1);
* 当(9 - L1)为奇数的时候,L3 = (9 - L1) / 2 + 1;否则L3 = (9 - L1) / 2;
* 那么此时,L3还可以缩小范围,当(n - i) > 1的时候,L3 = L3 - (L2 / 2);
*/
程序代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int count = 0;
for (int i = 1; i < n - 1; i++) {
int L1 = String.valueOf(i).length(); //数字 i的长度
int L2 = String.valueOf(n - i).length(); //数字(n - i) 的长度
int L3 = ((9 - L1) & 1) == 1 ? (9 - L1) / 2 + 1: (9 - L1) / 2; //当(9 - L1)为奇数的时候
L3 = (n - i) > 1 ? L3 - L2 / 2 : L3; //当(n - i) > 1的时候
for (int k = 1; k < Math.pow(10, (L3)); k++) {
int j = k * (n - i);
String s = i + "" + j +"" + k; //将i,j,k三个数字拼接成一个字符串
if(s.length() == 9) //当字符串的长度为9时满足条件
{
if(c(s)){
count ++;
}
}
}
}
System.out.println(count);
}
//定义一个布尔函数,判断字符串是否满足条件
public static boolean c(String s)
{
char[]c = s.toCharArray();
Arrays.sort(c);
String s1 = "123456789";
if(String.valueOf(c).equals(s1))return true;
return false;
}
}