[Java] Prime Cryptarithm

/* Use the slash-star style comments or the system won't see your
   identification information */
/*
ID: lincans1
LANG: JAVA
TASK: crypt1
*/
import java.io.*;
import java.util.*;

public class crypt1 {
    
    

	private Set<Integer> generate(int[] digits) {
    
    
		Set<Integer> set = new HashSet<>();
		for (int i = 0, N = digits.length; i < N; i++) {
    
    
			for (int j = 0; j < N; j++) {
    
    
				for (int k = 0; k < N; k++) {
    
    
					set.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
				}
			}
		}
		return set;
	}
	private boolean fit3(int number, boolean[] flag) {
    
    
		if (number > 999) return false;
		while (number > 0) {
    
    
			if (!flag[number % 10]) {
    
    
				return false;
			}
			number /= 10;
		}
		return true;
	}
	
	private boolean fit4(int number, boolean[] flag) {
    
    
		if (number > 9999) return false;
		while (number > 0) {
    
    
			if (!flag[number % 10]) {
    
    
				return false;
			}
			number /= 10;
		}
		return true;
	}

	private int count(int[] digits) {
    
    
		int ans = 0;
		boolean[] flag = new boolean[10];
		for (int digit : digits) {
    
    
			flag[digit] = true;
		}
		Set<Integer> set = generate(digits);
		
		for (int number : set) {
    
    
			for (int i = 0, N = digits.length; i < N; i++) {
    
    
				int product1 = number * digits[i];
				if (!fit3(product1, flag)) {
    
    
					continue;
				}
				for (int j = 0; j < N; j++) {
    
    
					int product2 = number * digits[j];
					if (!fit3(product2, flag)) {
    
    
						continue;
					}
					if (fit4(product1 * 10 + product2, flag)) {
    
    
						ans++;
					}
				}
			}
		}
		return ans;
	}

	public crypt1() throws IOException {
    
    
		// Use BufferedReader rather than RandomAccessFile; it's much faster
		BufferedReader f = new BufferedReader(new FileReader("crypt1.in"));
		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("crypt1.out")));
		
		int N = Integer.parseInt(f.readLine());
		int[] digits = new int[N];
		
		// Use StringTokenizer vs. readLine/split -- lots faster
		StringTokenizer st = new StringTokenizer(f.readLine());
		for (int i = 0; i < N; i++) {
    
    
			digits[i] = Integer.parseInt(st.nextToken());
		}
		
		int ans = count(digits);
		out.println(ans);
	    out.close();                                  // close the output file
	}
	
	public static void main (String [] args) throws IOException {
    
    
		new crypt1();
	}
}

Guess you like

Origin blog.csdn.net/weixin_41714373/article/details/112171519