思路:排列型回溯! 每产生排列的一个数,便检查该数是否符合要求,符合就dfs,否则尝试下一个排列!!! #include<stdio.h> #include<string.h> bool u[1010],p[10010],find; int n,m,d,a[1010]; void prime() { int i,j; memset(p,true,sizeof(p)); p[0]=p[1]=false; for(i=2;i*i<=10000;i++) { if(p[i]) { j=2; while(i*j<=10000) { p[i*j]=false; j++; } } } } int check(int l) { int i,s=a[l]; for(i=l-1;i>=1 && i>=l-d+1;i--) { s+=a[i]; if(p[s]) return 0; } return 1; } int dfs(int l) { int i,j,k; for(i=n;i<=m;i++) { if(u[i]) { a[l]=i; if(check(l)==1) { if(l==m-n+1) { find=true; return 0; } u[i]=false; dfs(l+1); if(find) return 0; u[i]=true; } } } return 0; } int main() { //freopen("1.txt","r",stdin); int i; prime(); while(1) { find=false; memset(u,true,sizeof(u)); scanf("%d %d %d",&n,&m,&d); if(n==0 && m==0 && d==0) return 0; dfs(1); if(find) { for(i=1;i<=m-n;i++) printf("%d,",a[i]); printf("%d/n",a[m-n+1]); } else printf("No anti-prime sequence exists./n"); } return 0; }