素数环c语言
㈠ 素数环为20时有几种
㈡ 悬赏并跪求c语言大神帮忙解决此问题!关于素数环的
文件输入输出应该不用多说吧。
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
至于算法的话,就是暴力搜索加剪枝:
如果当前值与上一个值之和是一个素数才继续向下搜索销扰
用一个stack[N]记录数字
深搜过程:
void dfs(int depth)
{
if (depth>n)
{
if (judge(stack[1]+stack[n]))
{
for (int i=1;i<=n;++i)
printf("%d ",stack[i]);
printf("\n");
}
return ;
}
for (int i=1;i<=n;i++)
if (!flag[i] && judge(stack[depth-1]+i))
{
stack[depth]=i;
flag[i]=1;
dfs(depth+1);
flag[i]=0;
}
}
判断素数
bool judge(int N) //返回0为不是素数,返回1为是素数
{
if (N<2) return 0;
for (int i=2;i<=(int)sqrt(N);++i)
if (N%i) return 0;
return 1;
}
最后注意一点,在执行dfs过程时直接dfs(2),然后令stack[1]=1;因为当stack[1]>桐斗塌1之时,它的解可以由stack[1]=1时的解变换而来。flag[i]是记录该数出现过没有,因为每局圆个数只能出现一次。
㈢ C语言 素数环问题
prime函数里,把条件判断x/y改为x%y
其它我没细看,有问题再告诉我吧。
㈣ c语言素数环问题求改错,不要其他代码就帮我改一下
不清楚你是要求1-20所有长度的素数环还是要求长度为20的所有素数环
按照后者枯猛给贺漏你改了一版程序出来
需要注意的有两点
一个是由于要递归尝试下一个数值,所以用来存结果的数组必须要作为参数传进去
另一个 必须有一个数组作为标志 表示哪些数用过 因为1-20是不能重复使用的
最后说明一下 在你这个基础上改出来的是求长度为20的所有素数环 这是一个相当大的数量
截止回答时 我的机器还在继续往出打印
如果想只求出一组就退出运行 可以把search中n==20判断里面的return 改成exit(0) (注意要添加stdlib头文件)
代码如下
#include<stdio.h>
intsushu(inti);
voidsearch(inta[],intb[],intn);
//目测程序功能为求长度为20的素数环
inta[21];
intb[21];//用来标记某个数是否被用过
voidmain()
{inti;
//for(i=1;i<21;i++)//如果只是寻没拍桥找固定的20个数,那么没必要循环
a[0]=b[0]=1;
search(a,b,1);//由于需要递归所以要把数组做为参数
// printf("result: ");//结果在search中输出
}
voidsearch(inta[],intb[],intn)
{intj,k,t;
if(n==20)
{
if(sushu(19))
{
for(j=0;j<20;j++)
printf("%d",a[j]);
printf(" ");
}
return;//只打印一组的话这里改成exit(0);
}
for(k=1;k<21;k++)
{
if(b[k]==1)continue;//数字k+1已用
a[n]=k+1;
b[k]=1;
if(sushu(n-1))
search(a,b,n+1);
b[k]=0;
}
}
intsushu(inti)
{
intj,b;
if(i==19)
a[20]=a[0];
for(j=2;j<a[i]+a[i+1];j++)
{b=(a[i]+a[i+1])%j;
if(b==0)
return0;}
if(a[i]+a[i+1]==j)
return1;
}
㈤ C语言素数环问题:输入n,输出n以内的素数环。我感觉思路是对的,怎么没有输出,请大侠看看!
#include<stdio.h>
#include<string.h>
int is_prime(int x)
{
int i,flag;
for(i=2;i<=x/2;i++)
if(x%i==0)
return 0;
return 1;
}
void dfs(int n,int *a,int *isp,int *vis,int cur)
{
if(cur==n&&isp[a[0]+a[n-1]])
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return ;
}
else
for(int i=1;i<=n;i++)
if(!vis[i]&&isp[i+a[cur-1]])//如果i没有袭差悔庆凯用过,并且与前一个数之和为素数拍正
{
a[cur]=i;
vis[i]=1;
dfs(n,a,isp,vis,cur+1);
vis[i]=0;
}
}
int main()
{ int i,n,a[100],isp[100],vis[100];
memset(vis,0,sizeof(vis));
memset(isp,0,sizeof(isp));
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=i+1;
for(i=1;i<100;i++)
isp[i]=is_prime(i);
dfs(n,a,isp,vis,0);
return 0;
}
判断素数有问题