主题:[讨论]素数环问题的解决
dfnhb
[专家分:30] 发布于 2007-04-11 10:43:00
【素数环】
〖问题描述〗
把从1到N这N个数摆成一个环,要求相邻的两个数的和是一个素数。[N<=20]
这个题目我一直没有办法解决,希望大家能一起帮帮我
回复列表 (共3个回复)
沙发
moz [专家分:37620] 发布于 2007-04-11 11:53:00
1. N 只能是偶数, 简单的验证可以试试 12345
2. 对于"剪枝","深度","广度","搜索","图","树"的概念有必要学习一下,
但我不懂,没法解释
3. 我用最笨的方法
A. N<=20,先用数组储存质数表( 最大值 < N*2 )
B. 遍历排列 (简单的可以试试我的字符串排列)
C. 判断相邻和是否在质数表中.
X. 筛选捷径: 奇偶奇偶奇偶......
板凳
Lovely哆啦 [专家分:1360] 发布于 2007-05-12 11:18:00
'素数环
'问题描述:
'把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
'问题分析:
'非常明显,这是一道回溯的题目。从1开始,每个空位有20(19)种可能,只要填进去的数合法:
'与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。
'算法流程:
'1、数据初始化;
'2、递归填数:
'判断第J种可能是否合法;
'A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个;
'B、如果不合法:选择下一种可能;
DECLARE SUB lCC (i)
DECLARE FUNCTION pd1 (j, i)
DECLARE FUNCTION pd2 (j, i)
DECLARE FUNCTION pd3 (x)
DIM SHARED N
CLS
INPUT N
IF N MOD 2 <> 0 THEN PRINT "ERROR!": END
DIM SHARED a(N)
a(1) = 1
lCC (2)
END
SUB lCC (i)
FOR j = 2 TO N
IF pd1(j, i) AND pd2(j, i) THEN
a(i) = j
IF i = N THEN
FOR k = 1 TO N: PRINT a(k); : NEXT k: END
ELSE
lCC (i + 1)
END IF
END IF
NEXT j
END SUB
FUNCTION pd1 (j, i) '判断与之前元素是否重复
pd1 = -1
FOR k = 1 TO i - 1
IF a(k) = j THEN pd1 = 0: EXIT FOR
NEXT k
END FUNCTION
FUNCTION pd2 (j, i) '如果和为素数,就判断j和它前一个数的和是否为素数,反之判断j和它前一个数的和是否为素数以及j和第一个数的和是否为素数
IF i < N THEN pd2 = pd3(j + a(i - 1)) ELSE pd2 = pd3(j + a(i - 1)) AND pd3(j + 1)
END FUNCTION
FUNCTION pd3 (x) '判断左边相邻的数的和是否为素数
pd3 = -1
FOR k = 2 TO INT(SQR(x))
IF x MOD k = 0 THEN pd3 = 0: EXIT FOR
NEXT k
END FUNCTION
3 楼
Matodied [专家分:7560] 发布于 2007-05-12 15:14:00
DECLARE FUNCTION isprime! (m!)
DECLARE SUB find (i!)
DECLARE SUB pri ()
CLS
DIM SHARED n '定义全局变量,先定义后使用
INPUT n
IF n MOD 2 = 1 THEN PRINT "ERROR!": END
DIM SHARED a(n) '定义全局变量,先定义后使用
CALL find(1)
END
SUB find (i) '找第i个元素
FOR j = 1 TO n
a(i) = j: f = 1 '定义第i个元素的值为j
IF i > 1 THEN '如果i>1
f = isprime(a(i) + a(i - 1))'如果该元素和前一个元素的和不是素数,则不要
FOR k = 1 TO i - 1
IF a(i) = a(k) THEN f = 0: EXIT FOR'如果有相同的,则不要
NEXT k
IF f THEN '只有2项检查全部通过,才做以下操作
IF i < n THEN '如果没有找完就
CALL find(i + 1) '找下一个
ELSE '如果找完
IF isprime(a(n) + a(1)) THEN CALL pri'如果头尾两个元素之和是素数,则打印
END IF
END IF
a(i) = 0 '不成功,撤消已选数的值
ELSE
CALL find(i + 1) '如果i=1,直接找下一个
END IF
NEXT j
END SUB
FUNCTION isprime (m) '判断素数
IF m = 1 THEN isprime = 0: EXIT FUNCTION
FOR k = 2 TO INT(SQR(m))
IF m MOD k = 0 THEN isprime = 0: EXIT FUNCTION
NEXT k
isprime = 1
END FUNCTION
SUB pri '输出
FOR i = 1 TO n
PRINT a(i);
NEXT i
END
END SUB
运行结果:
INPUT 10
OUTPUT 1 2 3 4 7 6 5 8 9 10
希望多给一点分!!!!!!
我来回复