天天看點

USACO 1.5 Superprime Rib (DFS)

#include <stdio.h>
#define DEBUG 0
#define TESTCASES 5
int length;
int firstDigit[4] = {2, 3, 5, 7};
int otherDigit[4] = {1, 3, 7, 9};

//效率比較高的判斷素數的寫法
int isPrime(int n){
	if (n == 2)
		return 1;
	if (n & 1 == 0)
		return 0;
	int i;
	for (i  = 3; i * i <= n; i += 2)
		if (n % i == 0)
			return 0;
	return 1;
}

void isSuperPrime(int num, int digits){
	if (!isPrime(num))
		return;
	if (digits == length){
		printf("%d\n", num);
		return;
	}
	int i;
	for (i = 0; i < 4; i++)
		isSuperPrime(num * 10 + otherDigit[i], digits + 1);
}
int main(){
#if DEBUG
	int testCase;
	for (testCase = 1; testCase <= TESTCASES; testCase++){
		char inputFileName[20] = "inputx.txt";
		inputFileName[5] = '1' +  (testCase - 1);
		freopen(inputFileName, "r", stdin);
		printf("\n#%d\n", testCase);
#endif

	scanf("%d", &length);

	int i;
	for (i = 0; i < 4; i++)
		isSuperPrime(firstDigit[i], 1);

#if DEBUG
	}
#endif
	return 0;
}