回 帖 发 新 帖 刷新版面

主题:[讨论]素数环问题的解决

【素数环】
〖问题描述〗
把从1到N这N个数摆成一个环,要求相邻的两个数的和是一个素数。[N<=20]
这个题目我一直没有办法解决,希望大家能一起帮帮我

回复列表 (共3个回复)

沙发

1.  N 只能是偶数, 简单的验证可以试试 12345
2.  对于"剪枝","深度","广度","搜索","图","树"的概念有必要学习一下,
    但我不懂,没法解释
3.  我用最笨的方法
      A.  N<=20,先用数组储存质数表( 最大值 < N*2 )
      B.  遍历排列 (简单的可以试试我的字符串排列)
      C.  判断相邻和是否在质数表中.
      X.  筛选捷径: 奇偶奇偶奇偶......

板凳

'素数环
'问题描述:
'把从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 楼

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

希望多给一点分!!!!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册