把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)
答案:839542176
通过分析题目,我们知道应该使被乘数尽量大,即被乘数的最高位最好是9。同时我们又担心这种情况下不会出现满足题目要求的积,但题目给出的三个例子说明了积是存在的。因此,我们可以确定下来全排列的第一位就是9。
下面给出代码:
import java.util.*;
public class Main{
static int n=9;
static int[] a=new int[10];
static boolean[] b=new boolean[10];
static List<Integer> list=new ArrayList<Integer>();//存放乘积,通过排序易得最大值
static boolean judge(int x){//判断x的9位是否数字1~9各出现一次
boolean[] c=new boolean[10];
for(int i=1;i<=9;i++){
c[x%10]=true;
x/=10;
}
for(int i=1;i<=9;i++)
if(!c[i])
return false;
return true;
}
static void dfs1(int step){//对于开头是9的后8个数进行全排列
if(step==n+1){
dfs2(a);
return;
}
for(int i=1;i<=8;i++){
if(!b[i]){
a[step]=i;
b[i]=true;
dfs1(step+1);
b[i]=false;
}
}
}
static void dfs2(int[] a){//插入*
String s="";
for(int i=1;i<=n;i++)
s+=Integer.toString(a[i]);
// System.out.println(s);
for(int i=1;i<9;i++){
String s1=s.substring(0,i);
String s2=s.substring(i);
int x=Integer.valueOf(s1);
int y=Integer.valueOf(s2);
int res=x*y;
String s3=Integer.toString(res);
if(s3.length()==9){
if(judge(res)){
System.out.println(s1+"*"+s2+"="+res);
list.add(res);
}
}
}
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
a[1]=9;//第一位固定为9
dfs1(2);//从第二个数字进行全排列
Collections.sort(list);
System.out.println(list.get(list.size()-1));//得最大值
}
}