最大乘积
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
…
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
public class 最大乘积 {
static long sum = -1;
static int[] arr = new int[9];
static int[] vis = new int[10];
public static void main(String[] args) {
// TODO Auto-generated method stub
// 839542176
// 全排列出数字,再选择位置插入乘号,再检查结果是否合规,再保存最大值
for (int i = 0; i < vis.length; i++) {
vis[i] = -1;
}
dfs(0);
System.out.println(sum);
}
private static void dfs(int cur) {
if (cur == arr.length) {
f();
return;
}
for (int i = 1; i <= 9; i++) {
if (vis[i] == -1) {
vis[i] = 1;
arr[cur] = i;
dfs(cur + 1);
vis[i] = -1;
}
}
}
private static void f() {
// 在数字索引后插入一个乘号,计算结果
long frist = 0;
long second = 0;
for (int i = 0; i < arr.length - 1; i++) {
frist = getFrist(i);
second = getSecond(i);
long num = frist * second;
if (check(num) && num > sum) {
sum = num;
System.out.println(frist + " " + second);
}
}
}
private static boolean check(long num) {
String s = Long.toString(num);
int[] book = new int[10];
for (int i = 0; i < s.length(); i++) {
book[s.charAt(i) - '0']++;
if (book[s.charAt(i) - '0'] > 1)
return false;
}
if (book[0] > 0)
return false;
for (int i = 1; i < book.length; i++) {
if (book[i] == 0)
return false;
}
return true;
}
private static long getSecond(int n) {
long second = 0;
long temp = (long) Math.pow(10, arr.length - n - 1 - 1);
for (int i = n + 1; i < arr.length; i++) {
second += arr[i] * temp;
temp /= 10;
}
return second;
}
private static long getFrist(int n) {
long frist = 0;
long temp = (long) Math.pow(10, n);
for (int i = 0; i < n + 1; i++) {
frist += arr[i] * temp;
temp /= 10;
}
return frist;
}
private static long toLong() {
long temp = 100000000;
long num = 0;
for (int i = 0; i < arr.length; i++) {
num += arr[i] * temp;
temp /= 10;
}
return num;
}
}