素数环java_[编程~算法]素数环,这绝对是一个噩梦

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

我说一下我的思路

首先,穷举法实在是太费代码,要尽量简化

于是我使用的是深度优先搜索(DFS),于是就有了下面这段代码

[C/C++ code]

#include

#include

#include

#include

#include

#include

using namespace std;

int tot = 0;//素数环计数器,初值为0

int v[50];//判断数字是否使用过的数组,1为使用过,0为未使用过

int lj[50];//路径数组

bool pd(int k){//判断是否为素数的子程序

for (int i = 2; i <=sqrt(k); i++){

if (k%i==0){

return false;

}

}

return true;

}

void pt();//声明输出函数

//==========核心代码DFS==========//

void dfs(int x){

for (int i = 1; i <= 20; i++){

if (pd(lj[x-1]+i)==1 && v[i]==0 || (x==1)){

lj[x] = i;

v[i] = 1;

if (x==20){

if (pd(lj[20] + lj[1])==1){

pt();

}

}

else{

dfs(x+ 1);

}

v[i] = 0;

}

}

}

void pt(){

for (int i = 1; i <= 20; i++){

printf("%d ", lj[i]);

}

tot++;

printf("\n");

}

int main(){

memset(v,0,sizeof(v));

dfs(1);

system("pause");

return 0;

}

反正这题只能省速度,不能省情况

[FreeBASIC code]

Dim Shared v(50) As Integer

dim Shared lj(50) As Integer

Dim Shared tot As Integer = 0

Declare Sub pt()

function pd(ByVal k As Integer) As Integer

Dim i As Integer

For i = 2 To Sqr(k)

If k Mod i = 0 Then

Return 0

End If

Next i

Return 1

End Function

Sub dfs(ByVal x As Integer)

Dim i As Integer

For i = 1 To 20

if pd(lj(x-1)+i)=1 or x=1 Then

If v(i)=0 Then

lj(x) = i

v(i) = 1

If x=20 Then

If pd(lj(20) + lj(1))=1 Then

pt()

End If

Else

dfs(x+1)

End If

v(i) = 0

EndIf

End If

Next i

End Sub

Sub pt()

Dim i As Integer

for i = 1 to 20

Print lj(i)

Next i

tot=tot+1

Sleep

End Sub

Sub main()

Dim i As Integer

For i = 0 To 50

v(i)=0

Next i

dfs(1)

Print tot

Sleep

End Sub

main()

End

//==========

@qiaozhanrong

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值