回 帖 发 新 帖 刷新版面

主题:帮帮我用QBasic 求长度为素数的路径个数 十万火急

第四题  求长度为素数的路径个数
[问题描述]
对于正整数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 楼


竖式Mato老师已经给我讲了,你给我讲讲这个问题好吗,我一遇到相关问题就运行速度太慢,我15号要去竞赛,你帮帮我好吗

12 楼


竖式Mato老师已经给我讲了,你给我讲讲这个问题好吗,我一遇到相关问题就运行速度太慢,我15号要去竞赛,你帮帮我好吗

13 楼

这一道题是拿来锻炼你对"节点"的认识的.
给你的提示是: 从某一点出发,到目的地,有若干条路线,把路线记录下来
这一点的上一个点,最多有两条路线,右或下,
这一点的路线就是它与下一两点的路线的和,

估计你是看不明白的,看多几次再说吧.

14 楼

这我知道,我也是这么想的呀,可一运行到7以上的数就太慢

15 楼

你需要把节点保存下来以便上一个节点调用使用.
当所以的节点都保存完后,就能得出结果了.
只是按倒序保存一次节点,花不了太多时间的,
关键是你怎样来处理数据罢了.

我估计十个人当中会有九点九个使用数组来解决这个问题.
但依我看,QB的字符串处理比数组处理功能更丰富更灵活更方便更快捷.

16 楼

[quote]这一道题是拿来锻炼你对"节点"的认识的.
给你的提示是: 从某一点出发,到目的地,有若干条路线,把路线记录下来
这一点的上一个点,最多有两条路线,右或下,
这一点的路线就是它与下一两点的路线的和,

估计你是看不明白的,看多几次再说吧.[/quote]

这是个比较高效的算法,只要把矩陈遍历一次就可以,很快的。别说20,就是200,2000也会很快出来结果。

17 楼

呵呵,2000? 你用QB运行给我看看

18 楼

可我不知道用字符串保存后怎么处理,怎么寻找素数

19 楼

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 楼

缩减一下.

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

我来回复

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