题意要求给定一个范围,然后指定一个区间d,使(2到d)的任意区间之和为合数即可。
深搜枚举
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int use[1001],prime[10001],vis[1001];
int n,m,d,flag;
bool dfs(int d,int th)
{
if(th==m-n+2)
{
flag=1;
printf("%d",use[1]);
for(int i=2;i<=th-1;i++)
printf(",%d",use[i]);
printf("\n");
return true;
}
for(int i=n;i<=m;i++)
{
if(vis[i]==0)
{
vis[i]=1;
use[th]=i;
int sum=i;
int f=1;
for(int j=th-1;j>=th-d+1&&j>=1;j--)
{
sum=sum+use[j];
//printf("%d %d %d\n ",sum,use[j],i);
if(prime[sum]==0)
{f=0; break;}
}
if (f==1&&dfs(d,th+1))
return true;
vis[i]=0;
}
}
return false;
}
int main()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=10000;i++)
{
if(prime[i]==0)
for(int j=2;j*i<=10000;j++)
{
prime[i*j]=1;
}
}
prime[1]=0;
prime[2]=1;
prime[3]=0;
while(scanf("%d%d%d",&n,&m,&d))
{
if(n==0&&m==0&&d==0) break;
flag=0;
memset(vis,0,sizeof(vis));
for(int i=n;i<=m;i++)
{
use[1]=i;
vis[i]=1;
if (dfs(d,2)) break;
vis[i]=0;
}
if(flag==0) printf("No anti-prime sequence exists.\n");
}
return 0;
}