天天看點

Java實作 藍橋杯VIP 算法提高 特殊的質數肋骨

算法提高 特殊的質數肋骨

時間限制:1.0s 記憶體限制:256.0MB

問題描述

  農民約翰母牛總是産生最好的肋骨。你能通過農民約翰和美國農業部标記在每根肋骨上的數字認出它們。農民約翰确定他賣給買方的是真正的質數肋骨,是因為從右邊開始切下肋骨,每次還剩下的肋骨上的數字都組成一個質數。

例如有四根肋骨的數字分别是:7 3 3 1,那麼全部肋骨上的數字 7331是質數;三根肋骨 733是質數;二根肋骨 73 是質數;當然,最後一根肋骨 7 也是質數。7331 被叫做長度 4 的特殊質數。

寫一個程式對給定的肋骨的數目 N (1<=N<=8),求出所有的特殊質數。數字1不被看作一個質數。

輸入格式

  單獨的一行包含N。

輸出格式

  按順序輸出長度為 N 的特殊質數,每行一個。

樣例輸入

4

樣例輸出

2333

2339

2393

2399

2939

3119

3137

3733

3739

3793

3797

5939

7193

7331

7333

7393

import java.util.Scanner;


public class 特殊的質數肋骨 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		n--;
		/**首位數字為素數的隻有2,3,5,7,*/
		f(2, n);//尋找首位數字為2的滿足條件度數
		f(3, n);//尋找首位數字為3的滿足條件度數
		f(5, n);//尋找首位數字為5的滿足條件度數
		f(7, n);//尋找首位數字為7的滿足條件度數
	}
 
	private static void f(long i, int n) {
		if (n == 0) {
			if (su(i))
				System.out.println(i);
		}
		if (su(i)) {
			/**個位數字是偶數不可能為素數*/
			f(i * 10 + 1, n - 1);
			f(i * 10 + 3, n - 1);
			f(i * 10 + 5, n - 1);
			f(i * 10 + 7, n - 1);
			f(i * 10 + 9, n - 1);
		}
	}
	private static boolean su(long n) {
		for (int i = 2; i * i <= n; i++) {
			if (n % i == 0)
				return false;
		}
		return true;
	}

}