[sicily ] anti-prime sequence

#include <stdio.h>
#include <string.h>

#define N 10000

bool finishFlag = false;
int primeList[N];
bool visited[1100] = {false};
int antiSequence[1100] = {0};
int n, m, d;

//simply judge whether a number is a prime, this method costs lost of time
// bool isPrime(int num) {
// 	//int end = sqrt(num);
// 	//i <= end

// 	for (int i = 2; i*i <= num; ++i) //a prime is not divisible by integers between 2 and sqrt root of it
// 	{
// 		if(num % i == 0)
// 			return false;
// 	}
// 	return true;
// }

void initPrimeList() {
	memset(primeList, true, sizeof(primeList)); 

	// even is not a prime
	//even times of a prime is also not a prime
	//the end limit of i is better the sqrt root of the maximun number
	for (int i = 2; i <= 100; ++i)
	{
		if(primeList[i]) {
			for(int j = 2; i*j <= N; j++)
				primeList[i*j] = false;
		}
	}
}

bool isAllNotPrime(int index) {

	int sum = antiSequence[index];
	int j = index-1;
	for (int i = 2; i <= d && j >= 0; ++i, j--)
	{
		sum += antiSequence[j];

		if(primeList[sum])
			return false;
	}
	return true;
}


void dfs(int index) 
{
	//printf("index = %d\n", index);


	if(index == m-n+1) { 
		finishFlag = true;
		return;
	}

	for (int i = n; i <= m; ++i)
	{
		if(visited[i])
			continue;
		antiSequence[index] = i;
		if(isAllNotPrime(index)) { 
			visited[i] = true;
			dfs(index+1);
			if(finishFlag)  //find a anti-prime sequence
				return;
			visited[i] = false;
		}
	}
}

int main() {

	initPrimeList();

	while(scanf("%d %d %d", &n, &m, &d) != EOF && n != 0) {
		int index = 0;
		memset(visited, false, sizeof(visited));
		memset(antiSequence, 0, sizeof(antiSequence));
		finishFlag = false;

		dfs(index);

		if(finishFlag) {
			for (int i = 0; i < m-n; ++i)
			{
				printf("%d,", antiSequence[i]);
			}
			printf("%d\n", antiSequence[m-n]);
		} else
			printf("No anti-prime sequence exists.\n");
	}
	return 0;
}


你可能感兴趣的:(sicily)