主题:帮帮我用QBasic 求长度为素数的路径个数 十万火急
snoopy7
[专家分:70] 发布于 2007-08-07 07:58:00
第四题 求长度为素数的路径个数
[问题描述]
对于正整数N(3<=N<=20),可以画出N阶的回形矩阵。下面画出的分别是3阶的,4阶的和7阶的回形矩阵。
n=3
1 1 1
1 2 1
1 1 1
n=4
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
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阶回形矩阵,从左上角出发,每步可以向右或向下走一格,走2*N-2步,可以达到右下角。
我们把这样的路径上所有格子中的数值之和,叫做该路径的长度。
本题要求,对于给出N值,求出N阶回形矩阵有多少路径的长度为素数?
如N=3时,路径及长度有:
[u]1[/u] [u]1[/u] [u]1[/u]
1 2 [u]1[/u]
1 1 [u]1[/u]
长度为5
[u]1[/u][u] 1[/u] 1
1 [u]2[/u] [u]1[/u]
1 1 [u]1[/u]
长度为6
[u]1[/u][u] 1[/u] 1
1 [u]2[/u] 1
1 [u]1[/u[u]] 1[/u]
长度为6
[u]1[/u] 1 1
[u]1[/u] [u]2[/u] [u]1[/u]
1 1 [u]1[/u]
长度为6
[u]1[/u] 1 1
[u]1[/u] [u]2[/u] 1
1 [u]1[/u][u] 1[/u]
长度为6
[u]1[/u] 1 1
[u]1[/u] 2 1
[u]1[/u] [u]1[/u] [u]1[/u]
长度为5
因此说,3阶回形矩阵有2条路径的长度为素数。
[输入输出]
输入:
一个自然数N(3<=N<=20,不必判错)。
输出:
一个正整数,即N阶回形矩阵中长度为素数的路径个数。
[样例]
输入:
3
输出:
2
回复列表 (共22个回复)
11 楼
snoopy7 [专家分:70] 发布于 2007-08-08 08:08:00
竖式Mato老师已经给我讲了,你给我讲讲这个问题好吗,我一遇到相关问题就运行速度太慢,我15号要去竞赛,你帮帮我好吗
12 楼
snoopy7 [专家分:70] 发布于 2007-08-08 08:36:00
竖式Mato老师已经给我讲了,你给我讲讲这个问题好吗,我一遇到相关问题就运行速度太慢,我15号要去竞赛,你帮帮我好吗
13 楼
moz [专家分:37620] 发布于 2007-08-08 09:50:00
这一道题是拿来锻炼你对"节点"的认识的.
给你的提示是: 从某一点出发,到目的地,有若干条路线,把路线记录下来
这一点的上一个点,最多有两条路线,右或下,
这一点的路线就是它与下一两点的路线的和,
估计你是看不明白的,看多几次再说吧.
14 楼
snoopy7 [专家分:70] 发布于 2007-08-08 12:25:00
这我知道,我也是这么想的呀,可一运行到7以上的数就太慢
15 楼
moz [专家分:37620] 发布于 2007-08-08 13:10:00
你需要把节点保存下来以便上一个节点调用使用.
当所以的节点都保存完后,就能得出结果了.
只是按倒序保存一次节点,花不了太多时间的,
关键是你怎样来处理数据罢了.
我估计十个人当中会有九点九个使用数组来解决这个问题.
但依我看,QB的字符串处理比数组处理功能更丰富更灵活更方便更快捷.
16 楼
logway [专家分:10] 发布于 2007-08-08 16:05:00
[quote]这一道题是拿来锻炼你对"节点"的认识的.
给你的提示是: 从某一点出发,到目的地,有若干条路线,把路线记录下来
这一点的上一个点,最多有两条路线,右或下,
这一点的路线就是它与下一两点的路线的和,
估计你是看不明白的,看多几次再说吧.[/quote]
这是个比较高效的算法,只要把矩陈遍历一次就可以,很快的。别说20,就是200,2000也会很快出来结果。
17 楼
moz [专家分:37620] 发布于 2007-08-08 16:11:00
呵呵,2000? 你用QB运行给我看看
18 楼
snoopy7 [专家分:70] 发布于 2007-08-08 21:11:00
可我不知道用字符串保存后怎么处理,怎么寻找素数
19 楼
moz [专家分:37620] 发布于 2007-08-09 15:28:00
declare function nextzs%(a%)
declare function geta$(i!)
declare function adda$(x$,y$,v!)
defint a-z
dim shared n,nn,s$
input n
nn=n*n
dim shared a$(nn)
s$=string$(nn,49)
for i=2 to(n+1)\2
for j=(i-1)*n+i to nn-i*n+i step n
mid$(s$,j,n-i*2+2)=string$(n,48+i)
next j,i
p=0
for i=nn to n step-n
p=p+1
a$(i)=mki$(p)+mkl$(1)
next
p=0
for i=nn to(nn-n+1)step-1
p=p+1
a$(i)=mki$(p)+mkl$(1)
next
i=nn-1
do
i=i-n
if i<1 then i=i+nn-n-1
a$(i)=adda$(a$(i+1),a$(i+n),asc(mid$(s$,i,1))-48)
a$(i+1+n)=""
loop until i=1
q@=0
for i=1 to len(a$(1))step 6
j=cvi(mid$(a$(1),i,2))
if j=nextzs%(j)then q@=q@+cvl(mid$(a$(1),i+2,4))
next
print q@
defsng a-z
function adda$(x$,y$,v)
z$=x$+y$
lx=len(x$)
i=1
do while i<len(z$)
if i<lx then
j$=mid$(z$,i,2)
k=instr(lx+1,z$,j$)
do while k>0
if k mod 6=1 then
mid$(z$,i+2,4)=mkl$(cvl(mid$(z$,i+2,4))+cvl(mid$(z$,k+2,4)))
z$=left$(z$,k-1)+mid$(z$,k+6)
k=instr(k,z$,j$)
else
k=instr(k+1,z$,j$)
end if
loop
end if
mid$(z$,i,2)=mki$(v+cvi(mid$(z$,i,2)))
i=i+6
loop
adda$=z$
end function
defint a-z
function nextzs%(a)
static s$
if len(s$)=0 then s$=mki$(2)+mki$(3)+mki$(5)+mki$(7)
e=len(s$)\2
z=cvi(right$(s$,2))
select case a
case is<=2
nextzs%=2
case is>=z
do until z>=a
do
if e>fre(" ")\4-10 or z>32765 then
print "error! out of memory!"
exit function
end if
z=z+2
if(z mod 3)<>0 and(z mod 5)<>0 then
i=4
q=sqr(z)
do
k=cvi(mid$(s$,i*2-1,2))
if z mod k=0 then exit do
i=i+1
loop until k>q
end if
loop until k>q
e=e+1
s$=s$+mki$(z)
loop
nextzs%=z
case is<z
l=1
r=e
do
m=(r+l)/2
b=cvi(mid$(s$,m*2-1,2))
if a>b then l=m else r=m
loop until r-l<2
nextzs%=cvi(mid$(s$,r*2-1,2))
end select
end function
如果你看得明白,那我可真是对你拜服的五体投地了,因为我自己都没看明白.
20 楼
moz [专家分:37620] 发布于 2007-08-09 15:30:00
缩减一下.
defint a-z
input n
dim shared a0%(n,n),a1&(n),a2@(n),a3$(n)
for i=1 to n
for j=i to n-i+1
for k=i to n-i+1
a0%(j,k)=i
next k,j,i
for i=n to 1 step-1
a3$(n)=mki$(n-i+1)+mkl$(1)
for j=n-1 to 1 step-1
a3$(j)=adda$(j,a0%(i,j))
next j,i
q@=0
for i=1 to len(a3$(1))step 6
j=cvi(mid$(a3$(1),i,2))
if j=nextzs%(j)then q@=q@+cvl(mid$(a3$(1),i+2,4))
next
print q@
function adda$(j,v)
z$=a3$(j)+a3$(j+1)
lx=len(a3$(j))
i=1
do while i<len(z$)
if i<lx then
j$=mid$(z$,i,2)
k=instr(lx+1,z$,j$)
do while k>0
if k mod 6=1 then
mid$(z$,i+2,4)=mkl$(cvl(mid$(z$,i+2,4))+cvl(mid$(z$,k+2,4)))
z$=left$(z$,k-1)+mid$(z$,k+6)
k=instr(k,z$,j$)
else
k=instr(k+1,z$,j$)
end if
loop
end if
mid$(z$,i,2)=mki$(v+cvi(mid$(z$,i,2)))
i=i+6
loop
adda$=z$
end function
function nextzs%(a)
static s$
if len(s$)=0 then s$=mki$(2)+mki$(3)+mki$(5)+mki$(7)
e=len(s$)\2
z=cvi(right$(s$,2))
select case a
case is<= 2
nextzs%=2
case is>= z
do until z>= a
do
if e>fre(" ")\4-10 or z>32765 then
print "error! out of memory!"
exit function
end if
z=z+2
if(z mod 3)<>0 and(z mod 5)<>0 then
i=4
q=sqr(z)
do
k=cvi(mid$(s$,i*2-1,2))
if z mod k=0 then exit do
i=i+1
loop until k>q
end if
loop until k>q
e=e+1
s$=s$+mki$(z)
loop
nextzs%=z
case is<z
l=1
r=e
do
m=(r+l)/2
b=cvi(mid$(s$,m*2-1,2))
if a>b then l=m else r=m
loop until r-l<2
nextzs%=cvi(mid$(s$,r*2-1,2))
end select
end function
我来回复