第七届蓝桥杯大赛省赛真题-填空题-凑算式(Java实现)

凑算式

	     B      DEF
	A + --- + ------- = 10
	     C      GHI
	         
	(如果显示有问题,可以参见【图1.jpg】)
	  
	这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
	比如:
	6+8/3+952/714 就是一种解法,
	5+3/1+972/486 是另一种解法。
	这个算式一共有多少种解法?
	注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

在这里插入图片描述

【解析】

看到1-9不同数字,则立马想到全排列,两种解题方式:暴力枚举和递归回溯
注意除法问题怎么解决,两种方式:
1、如题目未事先声明进行整除,消除分母,化为乘法运算,这样可以消除浮点数误差:
A + B/C + D/E = 10 --> ACE + BE + DC = 10CE
2、两个整数相除得到的是整数,所以2/1 和 5/2 得到的结果是一样的,所以此时需要注意将整数转换成浮点数,只要将分子1.0即可:A + B1.0/C + D*1.0/E = 10

方法一:暴力枚举

package 第七届省赛;

public class _3凑算式 {
    
    
	public static void main(String[] args) {
    
    
		int count = 0;
		for(int a=1; a<=9; a++) {
    
    
			for(int b=1; b<=9; b++) {
    
    
				if(b==a) continue;
				for(int c=1; c<=9; c++) {
    
    
					if(c==a||c==b) continue;
					for(int d=1; d<=9; d++) {
    
    
						if(d==a||d==b||d==c) continue;
						for(int e=1; e<=9; e++) {
    
    
							if(e==a||e==b||e==c||e==d) continue;
							for(int f=1; f<=9; f++) {
    
    
								if(f==a||f==b||f==c||f==d||f==e) continue;
								for(int g=1; g<=9; g++) {
    
    
									if(g==a||g==b||g==c||g==d||g==e||g==f) continue;
									for(int h=1; h<=9; h++) {
    
    
										if(h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue;
										for(int i=1; i<=9; i++) {
    
    
											if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue;
											/**
											 * 	     B      DEF
												A + --- + ------- = 10
												     C      GHI
											 */
											if((a+ (b*1.0/c)+ (d*100+e*10+f)*1.0/(g*100+h*10+i))==10) {
    
    	//由于整数相除的结果仍为整数,所以要将整数转为浮点数计算
												count++;
//												System.out.print(a+" "+b+" "+c+" "+d+" "+e+" "+f+" "+g+" "+h+" "+i+"             ");
//												System.out.println(a+" + " + b+"/"+c +" + "+ (d*100+e*10+f)+"/"+g*100+h*10*i +"="+(a+ (b*1.0/c)+ (d*100+e*10+f)*1.0/(g*100+h*10+i)));
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(count);
		//当0-9时,果299
		//当1-9时,结果29
	}
}

方法二:递归回溯

package 第七届省赛;

public class _3凑算式2 {
    
    
	static int count = 0;
	
	public static void main(String[] args) {
    
    
		int[] a = new int[9];
		int[] b = new int[]{
    
    1,2,3,4,5,6,7,8,9}; //从b里取数
		dfs(a,b,0);
		System.out.println(count);
	}

	private static void dfs(int[] a, int[] b, int i) {
    
    
		if(i==a.length) {
    
    	//结束条件
			if((a[0]+ (a[1]*1.0/a[2])+ (a[3]*100+a[4]*10+a[5])*1.0/(a[6]*100+a[7]*10+a[8]))==10)	//由于整数相除的结果仍为整数,所以要将整数转为浮点数计算
				count++;
			return;
		}
		for (int j = 0; j < b.length; j++) {
    
    
			if(b[j]!=-1) {
    
    
				a[i] = b[j];	//取数放进容器a里
				b[j]=-1;	//已使用,标记-1
				dfs(a,b,i+1);
				b[j] = a[i];	//调用结束了,把容器a里的数还回去
			}
		}
	}
}

结果

29

猜你喜欢

转载自blog.csdn.net/bugle_call/article/details/113094342