最大乘积
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
…
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)
答案:839542176
分析:
这种题题目一看就应该需要用到暴力全排列。分为以下两步:
第一:找出九个数字的全排列
第二:在九个全排列中找到合法的每一个乘法位置(需要知道我们并不需要将乘号的位置全部从1模拟到8)如下图:
可能还有同学会想着首先把去全排列生成,之后再把两个乘数在全排列生成,这里也是不需要的,因为在第一次全排列的时候,我们把所有情况都已经包括了。
package 第九届;
import java.util.HashSet;
public class 最大乘积 {
public static int shu [] = {1,2,3,4,5,6,7,8,9} ;
public static int max = 0;
public static void main(String[] args) {
dfs(0);
System.out.println(max);
}
public static void check(int flag) {
int t1 = 1;
String t1String = "";
int t2 = 1;
String t2String = "";
for (int i = 0; i <= flag + 1; i++) {
t1String+=shu[i];
}
for (int i = flag+2; i< shu.length; i++) {
t2String+=shu[i];
}
t1 = Integer.parseInt(t1String);
t2 = Integer.parseInt(t2String);
int ans = t1*t2;
if (ans > max && (ans+"").length() == 9 ) {
if (check2(ans+"")) {
max = ans;
System.out.println(t1+" "+t2+" "+max);
}
}
}
public static boolean check2(String string) {
HashSet<Character> hashSet = new HashSet<>();
for (int i = 0; i < shu.length; i++) {
hashSet.add(string.charAt(i));
}
if (hashSet.size() == 9 && !hashSet.contains('0')) {
return true;
}else {
return false;
}
}
public static void dfs(int index) {
if (index == 9) {
//表示当前已经生成了一个全排列
//遍历所有的情况,找出这个时候应该在那个位置放乘
for (int i = 0; i < 4; i++) {
check(i);
}
return;
}
for (int i = index; i < shu.length; i++) {
int k = shu[i];
shu[i] = shu[index];
shu[index] = k;
dfs(index+1);
k = shu[i];
shu[i] = shu[index];
shu[index] = k;
}
}
}