猜算式 蓝桥杯 java 蓝桥杯复习中.....

看这个算式:

☆☆☆ + ☆☆☆ = ☆☆☆

如果每个五角星代表 1 ~ 9 的不同的数字。

这个算式有多少种可能的正确填写方法?

173 + 286 = 459

295 + 173 = 468

173 + 295 = 468

183 + 492 = 675

以上都是正确的填写法!

注意:

111 + 222 = 333 是错误的填写法!

因为每个数字必须是不同的!

也就是说:1~9中的所有数字,每个必须出现且仅出现一次!

注意:

不包括数字“0”!

注意:

满足加法交换率的式子算两种不同的答案。

所以答案肯定是个偶数!

注意:

只要求计算不同的填法的数目

不要求列出所有填写法

更不要求填写源代码!


其实这一题的思路就是全排列 插符号 9个位置插1-9 9个数字 295+173=468

和173+295=468 是两种答案 意味着这题也不需要查重 所以递归全排列 求符合条件的即可!

import java.util.Vector;


public class Main14 {
	public static long count=0;
	//还是1-9全排列的问题  如果加法交换律算两种答案的话 那么意味着不要查重
	public static boolean matchResult(Vector<Character> result){
		int a=(result.elementAt(0)-'0')*100+(result.elementAt(1)-'0')*10+(result.elementAt(2)-'0');
		int b=(result.elementAt(3)-'0')*100+(result.elementAt(4)-'0')*10+(result.elementAt(5)-'0');
		int c=(result.elementAt(6)-'0')*100+(result.elementAt(7)-'0')*10+(result.elementAt(8)-'0');
		if(a+b==c){
			System.out.printf("%d + %d =%d\n",a,b,c);
		    return true;
		}
		return false;
	}
	public static void fullPermutation(Vector<Character> source ,Vector<Character> result){
		if(source.size()==0&&matchResult(result)){
			count++;
			return;
		}
		for(int i=0;i<source.size();i++){
			Vector<Character> tsource =new Vector<>(source);
			Vector<Character> tresult =new Vector<>(result);
			tsource.remove(i);
			tresult.add(source.elementAt(i));
			fullPermutation(tsource, tresult);
		}
		
	}
	public static void main(String[] args) {
		Vector<Character> source=new Vector<>();
		Vector<Character> result=new Vector<>();
		for(int i=0;i<9;i++){
			source.add((char)('0'+(i+1)));
		}
		fullPermutation(source, result);
		System.out.println(count);
	}
}

fullPermutation 全排列基本套路  <1>定义出口 <2>递归循环 

关键代码  

for(int i=0;i<source.size();i++){
			Vector<Character> tsource =new Vector<>(source);
			Vector<Character> tresult =new Vector<>(result);
			tsource.remove(i);
			tresult.add(source.elementAt(i));
			fullPermutation(tsource, tresult);
		}
还有一种写法  
 

 		for(int i=0;i<source.size();i++){
			result.add(source.elementAt(i));
			source.remove(i);
			fullPermutation(source, result);
			//复位
			source.add(i, result.elementAt(result.size()-1));
			result.remove(result.size()-1);}


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值