主题:大虾帮我改进一下吧
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小的时候还好,大的时候速度特别慢.
上面的两题请大虾们帮俺改进一下或是给出一种不同的算法,谢啦~~
在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小的时候还好,大的时候速度特别慢.
上面的两题请大虾们帮俺改进一下或是给出一种不同的算法,谢啦~~