python,实现用1到100间的全部自然数输出一个10行10列的矩阵,使得矩阵的每一行、每一列和对角线之和均相等。(单偶幻方:n*n,其中n=4*k+2, k为正整数)
def array3(k):
import numpy as np
c=2*k+1
n=2*c #n阶幻方
max=n*n #幻方最大值
m=c**2 #将n阶幻方分为四个小矩阵,每个矩阵的数字个数
d=(n,n)
mtrx=np.ones(d,dtype=int) #生成一个单位矩阵
#先输入第二象限的数据
mtrx[0,k]=1
i=0
j=k
for num in range(2,m+1):
i=i-1
j=j+1
if (num-1) % c==0:
i=i+2
j=j-1
if i<0:
i=2*k
if j>2*k:
j=0
mtrx[i,j]=num
print(mtrx)
#输入第四象限的数据
mtrx[2*k+1,3*k+1]=m+1
i=2*k+1
j=3*k+1
for num in range(m+2,2*m+1):
i=i-1
j=j+1
if (num-1) % c==0:
i=i+2
j=j-1
if i<c:
i=4*k+1
if j>4*k+1:
j=2*k+1
mtrx[i,j]=num
print(mtrx)
#输入第一象限的数据
mtrx[0,3*k+1]=2*m+1
i=0
j=3*k+1
for num in range(2*m+2,3*m+1):
i=i-1
j=j+1
if (num-1) % c==0:
i=i+2
j=j-1
if i<0:
i=2*k
if j>4*k+1:
j=2*k+1
mtrx[i,j]=num
print(mtrx)
#输入第三象限的数据
mtrx[2*k+1,k]=3*m+1
i=2*k+1
j=k
for num in range(3*m+2,4*m+1):
i=i-1
j=j+1
if (num-1) % c==0:
i=i+2
j=j-1
if i<c:
i=4*k+1
if j>2*k:
j=0
mtrx[i,j]=num
print(mtrx)
#开始换格子,用切片()
a1=mtrx[k,k:2*k].copy()
a2=mtrx[3*k+1,k:2*k].copy()
a3=mtrx[0:k,0:k].copy()
a4=mtrx[2*k+1:3*k+1,0:k].copy()
a5=mtrx[2*k-1:2*k+1,0:k].copy()
a6=mtrx[4*k:4*k+2,0:k].copy()
a7=mtrx[0:2*k+1,2*k+3:3*k+2].copy()
a8=mtrx[2*k+1:4*k+2,2*k+3:3*k+2].copy()
mtrx[3*k+1,k:2*k]=a1
mtrx[k,k:2*k]=a2
mtrx[2*k+1:3*k+1,0:k]=a3
mtrx[0:k,0:k]=a4
mtrx[4*k:4*k+2,0:k]=a5
mtrx[2*k-1:2*k+1,0:k]=a6
mtrx[2*k+1:4*k+2,2*k+3:3*k+2]=a7
mtrx[0:2*k+1,2*k+3:3*k+2]=a8
print(mtrx)
if __name__=="__main__":
k=int(input("请输入k值:"))
array3(k)