回 帖 发 新 帖 刷新版面

主题:大虾帮我改进一下吧

1.[题目]
在N*N的棋盘上(1<=N<=10)填入1,2...N*N共N*N个数,使得任意两个相邻的数之和为素数.
例如:当N=2时,有:
   1  2    其相邻的和为素数的有:
   4  3      1+2,1+4,4+3,2+3
在这里我们约定:左上角的格子里必须放1.

[程序]
CLS
INPUT "Please input N: ", N
IF N < 2 THEN 2
DIM A(N, N), B(N * N)
FOR I = 1 TO N * N: B(I) = I: NEXT I
DO
  FOR I = 1 TO N * N
    X = I \ N + 1: Y = I MOD N
    IF I MOD N = 0 THEN X = X - 1: Y = N
    A(X, Y) = B(I)
  NEXT I: F = 1
  FOR I = 1 TO N
    FOR J = 1 TO N
      IF I < N THEN
        P = A(I, J) + A(I + 1, J)
        GOSUB 10
        IF Q = 0 THEN GOTO 1
      END IF
      IF J < N THEN
        P = A(I, J) + A(I, J + 1)
        GOSUB 10
        GOSUB 10
        IF Q = 0 THEN GOTO 1
      END IF
    NEXT J
  NEXT I
  IF F = 1 THEN
    FOR I = 1 TO N
      FOR J = 1 TO N
        PRINT USING "####"; A(I, J);
      NEXT J: PRINT
    NEXT I: END
  END IF
1 J = N * N: K = N * N
  WHILE B(J) < B(J - 1) AND J > 1: J = J - 1: WEND
  IF J = 1 THEN EXIT DO
  WHILE B(K) < B(J - 1): K = K - 1: WEND
  SWAP B(J - 1), B(K)
  FOR I = J TO N * N - 1
    FOR K = I + 1 TO N * N
      IF B(I) > B(K) THEN SWAP B(I), B(K)
    NEXT K
  NEXT I
LOOP
2 PRINT "NO!"
END
10 Q = 1
   IF P < 2 THEN Q = 0: RETURN
   FOR K = 2 TO SQR(P)
     IF P MOD K = 0 THEN Q = 0: RETURN
   NEXT K
   RETURN

速度特别慢.

2.[题目]
对于正整数N(3<=N<=20),可以画出N阶的回形方阵.如N=7,则方阵为:
1  1  1  1  1  1  1
1  2  2  2  2  2  1
1  2  3  3  3  2  1
1  2  3  4  3  2  1
1  2  3  3  3  2  1
1  2  2  2  2  2  1
1  1  1  1  1  1  1
对于N阶回形矩阵,从左上角出发,每步可向右或向下走一格,走N*2-2步,可以到达右下角.
我们把这样的路径上所有格子中的数值之和,叫做该路径的长度.
本题要求,对于给出的N值,求出N阶回形矩阵有多少路径的长度为素数?
如N=3时,路径长度有
[b]1  1  1[/b]    [b]1  1[/b]  1    [b]1  1[/b]  1
1  2  [b]1[/b]    1  [b]2  1[/b]    1  [b]2[/b]  1
1  1  [b]1[/b]    1  1  [b]1[/b]    1  [b]1  1[/b]
长度=5     长度=6     长度=6

[b]1[/b]  1  1    [b]1[/b]  1  1    [b]1[/b]  1  1
[b]1  2  1[/b]    [b]1  2[/b]  1    [b]1[/b]  2  1
1  1  [b]1[/b]    1  [b]1  1[/b]    [b]1  1  1[/b]
长度=6     长度=6     长度=5

因此说,3阶回形矩阵有2条路径的长度为素数.

[程序]
CLS
INPUT "Please input N: ", N
DIM A(N, N), B(2 * N - 1, 2), C(N, N), D(N * 2 - 1 TO N * (N + 1) / 2)
FOR I = 1 TO (N + 1) \ 2
  FOR J = 1 TO (N + 1) \ 2
    IF I <= J THEN A(I, J) = I ELSE A(I, J) = J
    A(I, N + 1 - J) = A(I, J)
    A(N + 1 - I, J) = A(I, J)
    A(N + 1 - I, N + 1 - J) = A(I, J)
  NEXT J
NEXT I
J = 1: X = 1: Y = 1: S = 1
DO
  F = 1
  DO
    B(J, 1) = X: B(J, 2) = Y: J = J + 1: S = S + A(X, Y)
    IF X = N OR Y = N THEN
      C(X, Y) = 1
      IF X = N THEN Y = Y + 1 ELSE X = X + 1
    ELSE
      C(X, Y) = 2
      Y = Y + 1
    END IF
  LOOP UNTIL J = 2 * N - 1
  IF D(S) = 1 THEN F = 0: GOTO 1
  IF D(S) = 2 THEN 1
  FOR I = 2 TO SQR(S)
    IF S MOD I = 0 THEN F = 0: EXIT FOR
  NEXT I: D(S) = F + 1
1 IF F = 1 AND S <> 1 THEN T = T + 1
  FOR I = J TO 1 STEP -1
    IF C(B(I, 1), B(I, 2)) = 2 THEN EXIT FOR
  NEXT I
  IF I = 0 THEN EXIT DO
  X1 = B(I, 1): Y1 = B(I, 2): C(X1, Y1) = 1
  X = X1 + 1: Y = Y1: J = I + 1: S = 1
  FOR I = 1 TO J - 1
    S = S + A(B(I, 1), B(I, 2))
  NEXT I
LOOP
PRINT "S ="; T
END

N小的时候还好,大的时候速度特别慢.

上面的两题请大虾们帮俺改进一下或是给出一种不同的算法,谢啦~~

回复列表 (共19个回复)

沙发

先说第一题,
你的1是用来对排列处理的,
10是用来质数判断处理的.

要加快速度是可以的,
你考虑一下怎样过滤一些组合,
用数组的速度是比较快的.

在质数判断那里,建议使用函数来处理,

我试试在你的基础上修改一下看看吧.

板凳

旧代码已被删除,有需要请看下面更新

3 楼

旧代码已被删除,有需要请看后面更新.

4 楼

第一题是对的 但速度还是很慢 能不能在8秒钟内出来???
输出时矩阵下面的那个数字是什么意思???
他那上面还有一个条件 如果有多种解那么只要输出其中第一行或第一列和为最小的一种  这怎么写???

第二题N>11时 if k > len(z$) then z$ = z$ + chr$(i) 这句非法函数调用 应该怎么解决???
chr$(2) + chr$(3) + chr$(5) 是什么东东???

请大师给我解决一下以上问题 谢啦!?

5 楼

第一题我想到一个方法 先在1行1列放1然后找到>1的一个素数2 但2=1+1重复了那就再看3 3=1+2 2是素数所以1行2列放2 放完一行后第2行第一个就要和上面的加 第二个要同时和左边的上面的加的和符合要求 如果有一个元素出现没有符合要求的数就退回上一个元素再找更大的 直到全部填满
我觉得这应该是可行的 但我还不会编 请大师指点一下!!!

6 楼

对了 我第一题试过的 就是速度慢 没有错误啊!?

7 楼

旧代码已被删除

8 楼

第一题,可以在三秒内出结果了.

defint a-z
cls

input "n="; n
if n < 2 then end
nn = n * n

dim z(nn)
z(0) = 1
z(1) = 2
for i = 3 to nn * 2 step 2
    for j = 1 to z(0)
        if i mod z(j) = 0 then exit for
    next
    if j > z(0) then
       z(0) = z(0) + 1
       z(z(0)) = i
    end if
next

dim a(nn), b(nn, z(0)), c(nn)
for i = 1 to nn
    for j = 1 to z(0)
        if z(j) > i then
           if z(j) - i > nn then exit for
           b(i, 0) = b(i, 0) + 1
           b(i, b(i, 0)) = z(j) - i
        end if
    next
next

a(0) = 2
a(1) = 1
c(1) = 1
do
  k1 = a(a(0)) + 1
  i1 = 1
  i2 = 1
  g = 0
  do
    if a(0) > n then
       j = a(a(0) - n)
       for i1 = i1 to b(j, 0)
           if b(j, i1) >= k1 then
           if c(b(j, i1)) = 0 then
              g = 1
              k1 = b(j, i1)
              exit for
           end if
           end if
       next
       if g < 1 then exit do
    end if
    k = k1
    if a(0) mod n <> 1 then
       j = a(a(0) - 1)
       for i2 = i2 to b(j, 0)
           if b(j, i2) >= k1 then
           if c(b(j, i2)) = 0 then
              g = 2
              k1 = b(j, i2)
              exit for
           end if
           end if
       next
       if g < 2 then exit do
    end if
  loop until k = k1
  if g = 0 then
     a(a(0)) = 0
     a(0) = a(0) - 1
     c(a(a(0))) = 0
     if a(a(0)) < i4 then i4 = a(a(0))
  else
     a(a(0)) = k1
     c(k1) = k1
     a(0) = a(0) + 1
  end if
  if a(0) <= 1 then
     print "no"
     end
  end if
loop until a(0) > nn
for i = 1 to nn
    print using "###"; a(i);
    if i mod n = 0 then print
next

9 楼

对不起 一个人在一个主题中所得的专家分最多不能超过50分! 不能给你加分~~

10 楼

第二题我算到路径的总数了.
declare function fen@ (a@, b@)
defcur a-z
m = 25
dim shared s(m, m)
cls
for n = 1 to m
  print n, fen(n, n)
next

function fen (a, b)
if a = 1 or b = 1 then
   s(a, b) = 1
elseif s(a, b) = 0 then
   s(a, b) = fen(a - 1, b) + fen(a, b - 1)
end if
   fen = s(a, b)
end function

按照题目的要求,所谓的长度应该是
从 2*n-1 到 ((n\2)+1)*(n\2)*2 + ((n mod 2)-1)*(n\2) + (n mod 2)*(n\2+1) 之间
是个开区间,但具体数量怎么分布,我就还没有头绪.
区间 [ 2*n+1 , ∑n ]

我来回复

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