题目分析:全排列知识点的考察,重复检查的方法,我使用set集合去重性快速的利用Java API帮我对结果的1-9不重的检查,并且代码写起来方便,如果暴力检查去重的话........试题分析嘛,代码就写的漂亮一点,竞赛的话就没必要分提好多函数了,代码截图即源码参考如下
02 结果填空(满分39分)
标题:最大乘积
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
答案--839542176
由这两个排列情况生成8745231*96或96*8745231
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class 最大乘积 {
static int ans = 0;
public static void main(String[] args) {
String str = "123456789*";
char[] arr = str.toCharArray();
getPermutation(arr, 0);
System.out.println(ans);
}
private static void getPermutation(char[] arr, int k) {
if (k == arr.length) {// 一种新排列的生成
deal(arr, arr.length);
}
for (int i = k; i < arr.length; i++) {
swap(arr, k, i);
getPermutation(arr, k + 1);
swap(arr, k, i);
}
}
private static void deal(char[] arr, int len) {
int lnum = 0, rnum = 0, target = 0;
for (int i = 0; i < len; i++) {
if (arr[i] == '*')
target = i;
}
if (target != 0 && target != len - 1) {// 不在第一位和最后一位
lnum = new Integer(new String(arr, 0, target));//乘号左侧数值
rnum = new Integer(new String(arr, target + 1, len - (target + 1)));//乘号右侧数值
if (lnum * rnum == 839542176)
System.out.println(new String(arr));
if (check(lnum, rnum) && check2(lnum, rnum)) {
if (lnum * rnum > ans)
ans = lnum * rnum;
}
}
}
private static boolean check2(int lnum, int rnum) {// 0的检查,不能有0
char[] arr = (lnum * rnum + "").toCharArray();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '0')
return false;
}
return true;
}
private static boolean check(int lnum, int rnum) {
// set集合去重性做小检查结果1-9不重复
Set<String> set = new HashSet<String>();
char[] arr = (lnum * rnum + "").toCharArray();
if (arr.length == 9) {// list集合保证结果为9位数
for (char c : arr) {
set.add(c + "");
if (set.size() == 9)// set集合保证不重
return true;
}
}
return false;
}
private static void swap(char[] arr, int k, int i) {
char temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
}
}