把 1~9 这9个数字分成两组,中间插入乘号, 有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如: 984672 * 351 = 345619872 98751 * 3462 = 341875962 9 * 87146325 =
784316925 …符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。 (只提交乘积,不要提交整个算式)
思路
dfs对1-9的数字做全排列
简单的全排列可以先看这个
要求乘积1-9的每个数字都只出现一次,使用的是hashset
添加乘号,用的是一个变量,将数轴一分为二
尚存问题
代码在求解后,将全排列转化,如果不是逆序处理数字的话,不能求出正确结果,不知道如何处理
String str = new String();
for(int i = end-1;i>=start;i–) {
str = str+test[i];
}
import java.util.HashSet;
import java.util.Set;
public class Multi1030 {
static boolean flag[] = new boolean[10];
static int test[] = new int[10];
static int max = -1;
public static void main(String[] args) {
dfs(1);
System.out.println(""+max);
}
static void dfs(int step) {
if(step>9) {
check();
return;
}
for(int i = 1;i<=9;i++) {
if( flag[i]==false ) { //没有被访问过
flag[i] = true;
test[step] = i;
dfs(step+1);
flag[i]=false;
}
}
}
static void check() {
for(int i =2;i<=9;i++) {
//将10个数字 分成两部分 两部分都是数字
int a,b;
a = transfer(1, i);
b = transfer(i,10);
int tempMax,tempNum;
tempMax = a*b;
tempNum = tempMax;
//使用hashset来判断乘积是否存在重复的值
Set<Integer> numSet = new HashSet<>();
boolean flag = false;
while(tempMax!=0) {
if((tempMax%10)==0) { //不应该存在可以整除10的
flag = true;
return;
}
numSet.add(tempMax%10);
tempMax = tempMax / 10;
}
//9个不重复数 最大乘积和原来的比较
if(numSet.size()==9 && tempNum>max && !flag) {
System.out.println(a+"*"+b);
max = tempNum;
}
}
}
static Integer transfer(int start,int end) {
String str = new String();
for(int i = end-1;i>=start;i--) {
str = str+test[i];
}
return Integer.parseInt(str);
}
}