100 可以表示为带分数的形式100 = 3 + 69258 / 714
还可以表示为100 = 82 + 3546 / 197
注意特征带分数中数字1~9分别出现且只出现一次不包含0。
类似这样的带分数100 有 11 种表示法。
题目要求从标准输入读入一个正整数N (N<1000*1000)程序输出该数字用数码
1~9不重复不遗漏地组成带分数表示的全部种数。注意不要求输出每个表示
只统计有多少表示法
例如用户输入100
程序输出11
再例如用户输入105
程序输出6
代码如下:
public class Main{
public static boolean f(int a, int b, int c) {
int[] s = new int [10];
int g;
while(a>0) {
s[g=a%10]++;
if(s[g]>1) return false;
a/=10;
}
while(b>0) {
s[g=b%10]++;
if(s[g]>1) return false;
b/=10;
}
while(c>0) {
s[g=c%10]++;
if(s[g]>1) return false;
c/=10;
}
if(s[0]>0) return false;
for(int i=1; i<=9; i++) {
if(s[i]==0) return false;
}
return true;
}
public static void main(String[] args) {
int count = 0;
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int a=1; a<n; a++) {
for(int c=1; c<9999; c++) {
if(c==a) continue;
int b = (n-a) * c;
if(f(a, b, c)) count++;
}
}
System.out.println(count);
}
}
这个题我最开始使用暴力循环来求解,就是指定了9层循环来解,后来发现原来这三部分的数字的位数是可以变化的,因此不能够这样做。同时我发现左边加法的范围是从1到n-1,分母的范围最多是四位数字,因为如果是五位数字那么就会出现小于1的分数了。最重要的是,这个题可以反向求解,就是可以知道四部分的关系,我们来确定分子是怎样的。这时候只需要判断分子,分母,左边加数它们的每一位都不相同就可以了。
s数组就是这个作用。我们可以想到,0到9一共是10个数字,因此s数组的大小是10,其中每一位都表示这个数字出现的次数,对于1到9来说,出现次数超过1次或者没有出现,都是false,对于0来说,一次都不能出现。这就是判断的条件,尤其是0的判断,十分重要!

本文介绍了一个独特的数学问题,即如何使用数字1至9且仅使用一次来表示特定整数的带分数形式,并提供了一段Java代码实现。文章讨论了算法的设计思路及优化过程。
1万+





