【每日蓝桥】36、一六年省赛Java组真题“凑算式”

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

标题:凑算式

解题思路:

本题的求解思路是:首先应该对1~9这9个数进行全排列,排列之后数组中的数字安装题目要求分割,这个时候我们要注意的是:得到的三个数据都是分数,且分母不相同,这个时候我们就需要对数据进行同分,得到分母一样的三个数字,之后再对这三个数字相加,判断得到的分子是否是分母的10倍,如果是则说明该排列下的情况是成立的,有关数组元素的组合、排列、全排列不懂的小伙伴可以看我的这篇文章,【递归+回溯】实现数组元素的组合、排列和全排列

排列组合问题也是蓝桥杯近几年的高频考点之一,一定要掌握!

答案源码:

public class Year2016_Bt3 {

	static int ans = 0;
	public static void main(String[] args) {
		int [] arr = {1,2,3,4,5,6,7,8,9};
		f(arr,0);
		System.out.println(ans);
	}

	//将数组元素进行全排列
	private static void f(int[] arr, int k) {
		//如果数组已经排列完毕
		if (k==arr.length) {
			check(arr);
		}
		
		for (int i = k; i < arr.length; i++) {
			int t = arr[k];
			arr[k] = arr[i];
			arr[i] = t;
			//排列确定下一个元素
			f(arr, k+1);
			//回溯
			t = arr[k];
			arr[k] = arr[i];
			arr[i] = t;
		}
	}

	//判断排列好的元素是否符合题目要求
	private static void check(int[] arr) {
		int a = arr[3]*100+arr[4]*10+arr[5];//百位数的分子
		int b = arr[6]*100+arr[7]*10+arr[8];//百位数的分母
		int mol = arr[0]*arr[2]*b + arr[1]*b + a*arr[2];//同分后的分子
		int den = arr[2]*b;//同分后的分母
		//如果同分之后,分子是分母的10倍,则说明符合题目要求
		if (den*10==mol) {
			System.out.println(arr[0] + " + " + arr[1] + "/" + arr[2] + " + " + a + "/" + b);
			ans++;
		}
		               
	}

}

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

猜你喜欢

转载自blog.csdn.net/weixin_44985880/article/details/115009182