问题描述
问题描述
192这个数很厉害,用它分别乘以1、2、3,会得到:
192 x 1 = 192
192 x 2 = 384
192 x 3 = 576
把这三个乘积连起来,得到192384576,正好是一个1~9的全排列
我们把上面的运算定义为连接乘积:
m x (1 ... n) = k(其中m > 0 且 n > 1,对于上例,m = 192、n = 3、k = 192384576)
即k是把m分别乘以1到n的乘积连接起来得到的,则称k为m和n的连接乘积。
按字典序输出所有不同的连接乘积k,满足k是1~9的全排列
输出格式
每个k占一行
样例输出
显然,结果中应包含一行:
192384576
参考代码
package 连接乘积;
public class Exam {
//使用回溯枚举出所有全排列字串
static int[] arr = {1,2,3,4,5,6,7,8,9};
static boolean[] check = new boolean[9];
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
f(0);
}
private static void f(int len) {
if (len == 9) {
//是全排列,进行验证是否满足链接乘积
if (auth(sb.toString())) {
System.out.println(sb);
};
}else {
for (int i = 0; i < arr.length; i++) {
if (!check[i]) {
sb.append(arr[i]);
check[i] = true;
f(len+1);
sb.deleteCharAt(sb.length()-1);
check[i] = false;
}
}
}
}
private static boolean auth(String string) {
//遍历数字m
for (int i = 1; i <= string.length(); i++) {
String subStr = string.substring(0,i);
int num = Integer.parseInt(subStr);
//用来存储结果相连的字串
StringBuilder builder = new StringBuilder();
for (int n = 1; n < 10; n++) {
int result = num*n;
builder.append(result);//192384576
//结果相连长度超过9是错误的
if (builder.length() > 9)break;
//结果相连包括0是错误的
if (builder.indexOf("0") != -1)break;
//结果相连与原全排列字符串相同是正确的的
if (builder.toString().equals(string) && n >1) {
return true;
}
}
}
return false;
}
}