素數環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;
}
判斷素數有問題