填算式 ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。 这个算式有多少种可能的正确填写方法?

/*
 * 看这个算式:
☆☆☆ + ☆☆☆ = ☆☆☆
如果每个五角星代表 1 ~ 9 的不同的数字。
这个算式有多少种可能的正确填写方法?
173 + 286 = 459
295 + 173 = 468
173 + 295 = 468
183 + 492 = 675
以上都是正确的填写法!
注意:
111 + 222 = 333 是错误的填写法!
因为每个数字必须是不同的! 
也就是说:1~9中的所有数字,每个必须出现且仅出现一次!
注意:
不包括数字“0”!
注意:
满足加法交换率的式子算两种不同的答案。
所以答案肯定是个偶数!

注意:
只要求计算不同的填法的数目
不要求列出所有填写法
更不要求填写源代码!

答案不要写在这里,请写在“解答.txt”中!

 */
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class T01 {
	static List<int[]> lis = new ArrayList<int[]>();
	// 输出所有组合
	public static void print(){
		for(int[] x:lis){
			for(int y:x){
				System.out.print(y);
			}
			System.out.println();
		}
	}
	// 检测是否有重复元素
	public static boolean check2(int[] n){
		if(lis.size()==0) return false;
		for(int i=0;i<lis.size();i++){
			int a = n[0]*100+n[1]*10+n[2];
			int b = lis.get(i)[3]*100+lis.get(i)[4]*10+lis.get(i)[5];
			if(a!=b){
				return false;
			}
		}
		return true;
	}
	// 检测,并添加符合的组合
	public static void check(int[] n){
		int a = n[0]*100+n[1]*10+n[2];
		int b = n[3]*100+n[4]*10+n[5];
		int c = n[6]*100+n[7]*10+n[8];
		if(a+b==c){
			if(!check2(n)){	// 如果不重复,则添加
				lis.add(Arrays.copyOf(n, n.length));
			}
		}
	}
	// 全排列
	public static void f(int[] n,int start,int end){
		if(start>=end){
			check(n);	// 检测,并添加符合的组合
			return ;
		}else{
			for(int i=start;i<n.length;i++){
				int temp = n[start];
				n[start] = n[i];
				n[i] = temp;
				f(n,start+1,end);
				temp = n[start];
				n[start] = n[i];
				n[i] = temp;
			}
		}
	}
	public static void main(String[] args){
		int[] n = {1,2,3,4,5,6,7,8,9};
		f(n,0,n.length-1);
		print();	// 输出结果
		System.out.println("总个数:"+lis.size());	// 输出个数
	}
}
运行结果:
124659783
125739864
127359486
127368495
128439567
128367495

.........
.........
.........
.........
.........

745218963
746235981
748215963
754182936
752184936
763182945
762183945
715248963
716238954
718245963
718236954
783162945
784152936
782154936
782163945
总个数:336


方法二:另一种方法,下列是0-9的组合,没排除0
/*填算式
 * 看这个算式:
    ☆☆☆ + ☆☆☆ = ☆☆☆
    如果每个五角星代表 1 ~ 9 的不同的数字。
    这个算式有多少种可能的正确填写方法?
    173 + 286 = 459
    295 + 173 = 468
    173 + 295 = 468
    183 + 492 = 675
    以上都是正确的填写法!
    注意:
    111 + 222 = 333 是错误的填写法!
    因为每个数字必须是不同的! 
    也就是说:1~9中的所有数字,每个必须出现且仅出现一次!
    注意:
    不包括数字“0”!
    注意:
    满足加法交换率的式子算两种不同的答案。
    所以答案肯定是个偶数!

    注意:
    只要求计算不同的填法的数目
    不要求列出所有填写法
    更不要求填写源代码!
    答案不要写在这里,请写在“解答.txt”中!
 */
public class Demo01 {
	static int count=0;
	public static void main(String[] args){
		for(int i=1;i<=9;i++){ // 第一个数的百位
			for(int j=0;j<=9;j++){ // 十位
				for(int k=0;k<=9;k++){ // 个位
					for(int l=1;l<=9;l++){ // 第二个数的百位
						for(int m=0;m<=9;m++){ // 十位
							for(int n=0;n<=9;n++){ // 个位
								if(i!=j && i!=k && i!=l && i!=m && i!=n &&
										j!=k && j!=l && j!=m && j!=n &&
										k!=l && k!=m && k!=n &&
										l!=m && l!=n &&
										m!=n ){
									int a = i*100+j*10+k;
									int b = l*100+m*10+n;
									int c = a + b;
									int x,y,z;
									if(c>99&&c<999){
										x = c/100;
										y = c%100/10;
										z = c%10;
									}else{
										break;
									}
									if(x!=y&&x!=z&&y!=z &&
											x!=i && x!=j && x!=k && x!=l && x!=m && x!=n &&
											y!=i && y!=j && y!=k && y!=l && y!=m && y!=n &&
											z!=i && z!=j && z!=k && z!=l && z!=m && z!=n ){
										System.out.println(a+" + "+b+" = "+c);
										count++;
									}
								}
								
							}
						}
					}
				}
			}
		}
		System.out.println("总个数:"+count);
	}
}
运行结果:
103 + 469 = 572
103 + 479 = 582
103 + 579 = 682
103 + 649 = 752
103 + 749 = 852
103 + 759 = 862
104 + 579 = 683
104 + 759 = 863
105 + 269 = 374

... + ... = ...
... + ... = ...
... + ... = ...
... + ... = ...
... + ... = ...

784 + 136 = 920
784 + 152 = 936
786 + 134 = 920
805 + 137 = 942
806 + 147 = 953
807 + 135 = 942
807 + 146 = 953
835 + 107 = 942
837 + 105 = 942
846 + 107 = 953
847 + 106 = 953
总个数:1088

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值