|
|
发表于 2017-7-1 10:58:45
|
显示全部楼层
- import time
- def isin(n,m):
- return jz[n][m] if 0<=n<r and 0<=m<c and jz[n][m] in zs else 0
- def lg(n,m):#测试周围8个数是否是质数
- q= set((isin(n-1,m-1),isin(n-1,m),isin(n-1,m+1),isin(n,m-1),isin(n,m+1),isin(n+1,m-1),isin(n+1,m),isin(n+1,m+1)))
- if 0 in q :#移除0
- q.remove(0)
- return q
- while True:#循环测试
-
- te=input('请输入行(空格)列').split()
- tt=time.time()
-
- if te=='0' or len(te)!=2:break
-
- r,c=[int(i) for i in te]#输入矩阵行列
- zs=[0,0]+[1]*(r*c-2)#生成质数列表
- for i,j in enumerate(zs):
- if j:
- for k in range(i*i,r*c,i):
- zs[k]=0
- zs=set([i for i,j in enumerate(zs) if j])
- jz=[[0]*c for j in range(r)]#生成矩阵
- m,n,fx,x=0,0,0,0
- while x<r*c:
- x+=1
- jz[m][n]=x
- if fx==0:#向右
- if n+1==c or jz[m][n+1]!=0:
- m,n,fx=m+1,n,1#向下
- else:
- m,n,fx=m,n+1,0#向右
- elif fx==1:#向下
- if m+1==r or jz[m+1][n]!=0:
- m,n,fx=m,n-1,2#向左
- else:
- m,n,fx=m+1,n,1#向下
- elif fx==2:#向左
- if n==0 or jz[m][n-1]!=0:
- m,n,fx=m-1,n,3#向上
- else:
- m,n,fx=m,n-1,2#向左
- elif fx==3:#向上
- if m==0 or jz[m-1][n]!=0:
- m,n,fx=m,n+1,0#向右
- else:
- m,n,fx=m-1,n,3#向上
- if c<=30:
- t=""
- y=""
- for i in jz:
- for j in i:
- t+='%4d ' % j
- y+='%4d ' % j if j in zs else '%4d ' % 0
- t+='\n'
- y+='\n'
- print(t)
- print(y)
- minn=[0,0,0]#
- for i in range(r):
- for j in range(c):
- ls=lg(i,j)#邻居,返回所有质数邻居
- if (jz[i][j]<minn[0] and len(ls)==minn[1]) or len(ls)>minn[1] or i==j==0:
- minn[0],minn[1],minn[2]=jz[i][j],len(ls),list(ls)
- minn[2]=0 if minn[2]==[] else minn[2]
- print('数字%s有%s个质数邻居,分别是%s' % (minn[0],minn[1],minn[2]))
- print(time.time()-tt)
复制代码
请输入行(空格)列1 1
1
0
数字1有0个质数邻居,分别是0
0.031193256378173828
请输入行(空格)列2 2
1 2
4 3
0 2
0 3
数字1有2个质数邻居,分别是[2, 3]
0.021895408630371094
请输入行(空格)列50 50
数字198有4个质数邻居,分别是[2, 3, 197, 199]
0.012151479721069336
请输入行(空格)列100 100
数字1237有4个质数邻居,分别是[1607, 1609, 857, 859]
0.11562013626098633
请输入行(空格)列
不明白测试数据是随机给出,还是要把n从1-100,m从1-100所有的矩阵统计出来 |
评分
-
查看全部评分
|