全部版块 我的主页
论坛 金融投资论坛 六区 金融学(理论版) 量化投资
852 0
2023-02-18
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)


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群