solution.java 1.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
import java.util.*;

public class Main {
    static int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    static int ans;

    public static void main(String[] args) {
        f(0);
        System.out.println(ans / 2);
    }

    // 全排列
    private static void f(int k) {
        // 全排列终点
        if (k == a.length) {
            // 处理该种排列下所有的乘法可能
            for (int i = 1; i < a.length; i++) {
                int x1 = a2i(0, i);
                int x2 = a2i(i, a.length);
                // 如果乘积也包含了九个数字,ans++
                if (check(x1 * x2)) {
                    ans++; // 这里没有考虑x1和x2交换顺序的情况,所以最后输出时要除以2
                }
            }
        }
        // 全排列
        for (int i = k; i < a.length; i++) {
            int t = a[i];
            a[i] = a[k];
            a[k] = t;

            f(k + 1);

            t = a[i];
            a[i] = a[k];
            a[k] = t;

        }
    }

    // 判断x是否是一个包含九个数字的数
    private static boolean check(int x) {
        String s = x + "";
        if (s.length() != 9 || s.indexOf('0') > -1) {
            return false;
        }
        Set<Character> set = new HashSet<Character>();
        for (int i = 0; i < s.length(); i++) {
            set.add(s.charAt(i));
        }
        if (set.size() == 9) {
            return true;
        }
        return false;
    }

    // 将a数组[begin,end)转换为整数
    private static int a2i(int begin, int end) {
        int res = a[begin];
        for (int i = begin + 1; i < end; i++) {
            res *= 10;
            res += a[i];
        }
        return res;
    }

}