把 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); } }