java 蓝桥杯 带分数

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

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的判断,十分重要!

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值