用0~9使等式##*#=#*##=###成立,数字不重复

时间:2022-11-05 15:02:58
编写程序,用数字1,2,3,4,5,6,7,8,9代替一下算式中的#,使等式成立。
##*#=#*##=###
要求9个数字都必须用到。

正好前几天用递归解决了遍历m个元素取k个的问题,今天用同样的思路做出了全排列。

每次循环都要开一个新数组,内存开销大。

也可以把九个数字转成StringBuilder,是否内存占用会变小?如果不用递归,应该如何解决呢?

------Output------
29*6=3*58=174
58*3=6*29=174
39*4=2*78=156
78*2=4*39=156

import java.util.*;

public class Equation{
public static void main(String[] args){
final int N = 9;
int[] num = new int[N];
for(int i = 0; i < N; i++){
num[i] = i+1;
}
rank(num, num.length-1);
}

/**
* 验证算式##*#=#*##=###
* 一共三个表达式
*/
public static void confirmEquation(int[] arr){
int x1 = arr[0]*10+arr[1];
int x2 = arr[2];
int x3 = arr[3];
int x4 = arr[4]*10+arr[5];
int x5 = arr[6]*100+arr[7]*10+arr[8];
if(x1*x2 == x5 && x3*x4 == x5){
System.out.println(x1 + "*" + x2 + "=" + x3 + "*" + x4 + "=" + x5);
}
}

/**
* 从右向左调整数组元素
* index为正在排序的最大位索引
* 由于此处形参是引用传递,为免影响原数组,开一个新数组进行处理
*/
public static void rank(int[] num, int index){
int temp;
if(index == 0){
confirmEquation(num);
}
else{
for(int i = 0; i <= index; i++){ //i=index则不交换
int[] arr = Arrays.copyOf(num, num.length);
temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
rank(arr, index-1);
}
}
}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。