原题链接
思路:这个题是一个全排列问题,首先把1-9的全排列整出来,然后再写一个循环,将两个数段相乘,判断乘积是否为一个含有1-9不重复数字的值。
import java.util.HashSet;
public class Main {
public static int arr[] = {1,2,3,4,5,6,7,8,9};
public static int ans = 0;
//将一个数段变为一个整数
public static int toint(int begin,int end) {
String res = "";
for(int i=begin;i<=end;i++) {
res+=arr[i];
}
return Integer.parseInt(res);
}
public static boolean check(long x) {
if(String.valueOf(x).length()!=arr.length)return false;
HashSet<Integer> hs = new HashSet<Integer>();
while(x!=0) {
hs.add((int)x%10);
x/=10;
}
//利用HashSet自动去重的特性判断有没有重复的数字,因为结果只能包含1-9,所以不能包含0
return !hs.contains(0)&&hs.size()==9;
}
public static void qpl(int k) {
if(k>=arr.length) {
for(int i=0;i<arr.length-1;i++) {
//截取两个数段,分别是从0-i,与i+1-arr.length-1
int a = toint(0,i);
int b = toint(i+1,arr.length-1);
if(check(a*b))ans++;
}
}else {
//下边是全排列的模板
for(int i=k;i<arr.length;i++) {
int t=arr[i];arr[i]=arr[k];arr[k]=t;
qpl(k+1);
t=arr[i];arr[i]=arr[k];arr[k]=t;
}
}
}
public static void main(String[] args) {
qpl(0);
//因为9213*85674与85674*9213算为一个结果,所以最终结果需/2
System.out.println(ans/2);
}
}