Java打印回型数组

见到很多人纠结这个问题,我闲着没事就打着玩玩,把如下代码放上来来让大家欣赏欣赏,希望每个人看完都会非常的快乐!

/** 
 * @class 打印回型数组Su_Huirong版 
 * @author Su_Huirong 
 * @time 5小时 
 * @version Su_Huirong 5小时版 历经各种磨难 各种考验 调试时间3h  
 */  
import java.util.Scanner;  
public class Test {  
    /** 
     * @row 列 
     * @length 行 
     * @sum 数组元素数量 
     * @math 二维数组:第一个维度为列,第二个维度为行 
     */  
    int row,length;  
    int num;  
    int[][] math;  
    /** 
     * 数组初始化: 
     * 根据元素数量sum判断行和列,给二维数组分配空间 
     */  
    public void initial(){  
        /** 
         * @temp 保存乘积等于sum的两个因数的差,取差小的两个因数,比如sum为24,因数有1、2、3、4、6、8、12。  我们取因数4、6而不是取因数1、12 
         */  
        int temp=num+1;  
        length=(num+1)/2;  
        for(int i=temp;i>0;i--){  
            for(int j=1;j<=i;j++){  
                if(i*j==num&&i-j<temp){  
                    row=j;  
                    length=i;  
                    temp=i*j;  
                }  
            }  
        }  
        /** 
         * @followRow 此变量用于追踪一轮赋值结束后下一次赋值的位置(列) 
         * @followLength 此变量用于追踪一轮赋值结束后下一次赋值的位置(行) 
         * @flagRow 标记赋值范围(列的范围) 
         * @flagLength 标记赋值范围(行的范围) 
         */  
        math=new int[row][length];  
        int followRow=0,followLength=0;  
        int flagRow=0,flagLength=1;  
        /** 
         * @row 用来表示当前行 
         * @length 用来表示当前列 
         */  
        row=0;  
        length=0;  
        /** 
         * 核心函数(3h调试的就是他) 
         * 4个if选择结构判断坐标与追踪坐标的位置判断方向上、下、左、右从而判断如何赋值 
         */  
        for(int i=1;i<=num;){  
            /**向右*/  
            if(row==flagRow&&length<flagLength){  
                followLength=math[0].length-1;  
                while(math[row][followLength]!=0&&followLength>0){  
                    followLength--;  
                }  
                while(length<followLength){  
                    math[row][length++]=i++;  
                }  
                flagRow=row+1;  
                flagLength=length;  
            }  
            /**向下*/  
            if(row<flagRow&&length==flagLength){  
                followRow=math.length-1;  
                while(math[followRow][length]!=0&&followRow>0){  
                    followRow--;  
                }  
                while(row<followRow){  
                    math[row++][length]=i++;  
                }  
                flagRow=row;  
                flagLength=length-1;  
            }  
            /**向左*/  
            if(row==flagRow&&length>flagLength){  
                followLength=0;  
                while(math[row][followLength]!=0&&followLength<math[0].length-1){  
                    followLength++;  
                }  
                while(length>followLength){  
                    math[row][length--]=i++;  
                }  
                flagRow=row-1;  
                flagLength=length;  
            }  
            /**向上*/  
            if(row>flagRow&&length==flagLength){  
                followRow=0;  
                while(math[followRow][length]!=0){  
                    followRow++;  
                }  
                do{  
                    math[row--][length]=i++;  
                }while(row>followRow);  
                flagRow=row;  
                flagLength=length+1;  
            }  
              
        }  
    }  
    /** 
     * @show() 循环打印二维数组 
     * 
     */  
    public void show(){  
        for(int i=0;i<math.length;i++){  
            for(int j=0;j<math[i].length;j++){  
                System.out.print(math[i][j]+"\t");  
            }  
            System.out.println();  
        }  
    }  
    /** 
     * @main() 主方法 
     */  
    public static void main(String[] args){  
        Scanner input=new Scanner(System.in);  
        Test t=new Test();  
        System.out.print("请输入环形数组元素数量:");  
        t.num=input.nextInt();  
        t.initial();  
        t.show();  
    }  
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值