高阶幻方

本文介绍了如何使用Java编程实现高阶幻方,包括奇数阶和偶数阶(尤其是4的倍数阶)幻方的构造方法,详细阐述了编程思路并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

百知教育——二维数组求高次幻方

​ 最近刚刚接触java,本该老老实实的码代码,奈何笔者好胜心太重,总想凸显自己的“聪明才智”,在老师指导下,开始试着用java做出幻方。初次试水,还请各位大佬多多指教。

关于幻方

​ 幻方是一种将数字安排在正方形格子中,使每行、列和对角线上的数字的和都相等的方法。幻方可以分为完全幻方、乘幻方和高次幻方等。

​ 完全幻方指一个幻方行、列、主对角线机泛对角线各数之和均相等。

​ 乘幻方指一个幻方行列、对角线各数乘积相等。

​ 高次幻方是指,当组成幻方各数替换为2,3,……,n次幂时,仍能满足条件者,称此幻方为n次幻方。n阶幻方是由前n2(n的2次方)个自然数组成一个n阶方阵,其各行、各列及两条对角线所含的n个数的和相等。计算任意阶幻方的各行、各列、各条对角线上所有数的和的公式是:S=n*(n2+1)/2。其中,n为幻方的阶数,所求的数为S。

编程思路

对平面幻方的构造,分为三种情况:n为奇数,n为4的倍数,n为其他偶数(4*n+2的形式)

奇数阶幻方

​ n为奇数时,最简单: (1)将1放在第一行中间一列;

​ (2)从2开始直到n*n止各数依次按下列规则存放:

​ 按45°方向行走,如右上

​ 每一个数存放在的行比前一个的行数减一,列数加一

​ (3)如果行列范围超出矩阵范围,则回绕。

​ 例如:1在第一行,2则放在最下一行,列数加一

​ (4)如果按上面的规则确定的位置上已有数字,或上一个数是第1行第n列时,则把

​ 下一个数放在上一个数的下面。

偶数阶幻方

普通偶数阶幻方

​ 当n为非4的倍数的偶数(即4n+2)时:首先把大方阵分解为4个奇数(2m+1)子方阵。

​ 按上述奇数阶幻方给4个子方阵对应赋值:

​ 由小到大依次为上左子阵(i),下右子阵(i+v),上右子阵(i+2v),下左子阵(i+3v)

​ 即4个子阵对应元素相处v,其中v=n*n/4。

​ 四个子矩阵由小到大排列方式为①③④②

​ 然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列在对应交换(j<t或j>n-t+2),a(t-1,0)与a(t+u,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换,其中u=n/2,t=(n+2)/4。

​ 上述交换是行列及对角线上的元素之和相等。

4的倍数阶幻方

​ 采用对称元素交换法。

​ 首先把数1到n*n按从上到下,从左到右顺序填入矩阵;

​ 然后将方阵的所有4*4子方阵中的两对角线上位置的数关于方阵中心作对称交换,即a(i,j)与a(n+1-i,n+1-j)交换,所有其他位置的数不变。

​ 以上方法值适合于n为4或4的倍数时。

代码内容

奇数阶幻方
/*
(1)将1放在第一行中间一列;
(2)从2开始直到n*n止各数依次按下列规则存放:
		按45°方向行走,如右上
		每一个数存放在的行比前一个的行数减一,列数加一
(3)如果行列范围超出矩阵范围,则回绕;
	例如:1在第一行,2则放在最下一行,列数加一
(4)如果按上面的规则确定的位置上已有数字,或上一个数是第1行第n列时,则把
	下一个数放在上一个数的下面。	
 */
import java.util.Scanner;//导包
public class OddMagicSquare {
   
   
	public static void main(String[] args) {
   
   
		Scanner sc=new Scanner(System.in);
        System.out.println("输入奇数阶幻方的的阶数:");
		int n=sc.nextInt();//n为幻方的阶数
        int[][] a=new int[n][n];//创建一个二维数组
        //将1放在第一行中间一列
        int line=0;//行数
        int row=n/2;//列数
        //将1~n*n存在num中
        int num=1;
        while(num<n*n){
   
   
            /*
                    把下一个数放在上一个数的下面的操作一共会有n次
            */
            for(int i=1;i<=n;i++){
   
   
                /*
                        以三阶幻方为例:
                            第一次外层循环:内层循环的操作
                                            1
                                        3
                                                2
                            第二次外层循环:内层循环的操作
                                                6
                                            5
                                        4
                            第三次外层循环:内层循环的操作
                                        8
                                                7
                                            9
                            最后的结果:
                                        8	1	6
                                        3	5	7
                                        4	9	2
                 */
                for (int j = 1; j <=n; j++) {
   
   
                    a[line][row]=num;//1~n*n依次赋值
                    num++;
                    if(j==n)continue;
                    //内层循环n次之后,不再执行之后的代码
                    //每一个数存放在的行比前一个的行数减一,列数加一
                    line--;
                    row++;
                    //如果行列范围超出矩阵范围,则回绕
                    if (line==-1) {
   
   
                        line=n-1;
                    }
                    if(row==n){
   
   
                        row=0;
                    }
                }
                // 把下一个数放在上一个数的下面
                line++;
            }
        }
        //将二维数组a遍历打印
        for(int i=0;i<a.length;i++){
   
   
            for(int j=0;j<a[i].length;j++){
   
   
                System.out.print(a[i][j]+"\t");
            }
            System.out.println();
        }
    }
                 
}

偶数阶幻方

普通偶数阶幻方
/*
当n为非4的倍数的偶数(即4n+2)时:首先把大方阵分解为4个奇数(2m+1)子方阵。
按上述奇数阶幻方给4个子方阵对应赋值:
		由小到大依次为上左子阵(i),下右子阵(i+v),上右子阵(i+2v),下左子阵(i+3v)
		即4个子阵对应元素相处v,其中v=n*n/4。
		四个子矩阵由小到大排列方式为①③④②
然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列在对应交换(j<t或j>n-t+2),a(t-1,0)与a(t+u,0);a(t-                    	  1,t-1)与a(t+u-1,t-1)两对元素交换,其中u=n/2,t=(n+2)/4。
上述交换是行列及对角线上的元素之和相等。

*/
package magic_square;
import java.util.Scanner;
public class EvenMagicSquare {
   
   
	public static void main(String[] args) {
   
   
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[][] a=new int[n][n];
		int line=0;
		int row=n/4;
		int num=1;
		for(int i=1;i<=n/2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值