回形数的思路,规律及输出代码(数组章节即学即练)

 整体思路图

 规律解释及代码

package shuzu;
import java.util.Scanner;
public class shuzu {
     public static void main(String[] args) {
          /*回形数整体思路:
           * 步骤:
           * 1、请用户输入一个数n,然后获得该值的回形数
           * 2、观察回形数规律,可以拆分上下左右为四大部分,即分为四大部分分别输出,上下两大部分又分别拆分为奇数和偶数情况讨论。
           * 3、找出规律,其实沿着左上,右上,左下,右下对角线方向,它们沿着中心的数是有公式规律的
           *     这里以n=10为例子:那么int[][] =new int [x][y]=new int [10][10],输出的大概是以10×10的正方形
           *     以第一列和第一行为0,分别排序为:
           *       0   1   2   3   4  5   6   7   8   9  ----y(b)
           *   0 (1   2   3   4   5  6   7   8   9  10)          |
           *   1 36 (37  38  39  40  41  42  43  44)11          |
           *   2 35 64  (65  66  67  68  69  70) 45 12          |
           *   3 34 63   84 (85  86  87  88) 71  46 13          V列
           *   4 33 62   83  96 (97  98) 89  72  47 14
           *   5 32 61   82  95 |100 99| 90  73  48 15
           *   6 31 60   81 |94  93  92  91| 74  49 16
           *   7 30 59  |80  79  78  77  76  75| 50 17
           *   8 29 |58  57  56  55  54  53  52  51|18     
           *   9 |28 27  26  25  24  23  22  21  20 19|
           *   |
           *   |
           *   |
           *   x(a)------>行
                那么左上角沿着对角线到中心的规律为:4 * x(n - x) + 1,随着x=1,2,3,4……依次数为:1、37、65、85……
                那么右上角沿着对角线到中心的规律为:(1 + 4 * x)(n - x) - x;随着x=1,2,3……分别为:10、44、70、88
           *    那么左下角沿着对角线到中心的规律为:(4 * (n - x) - 1) * (n - (n - x)) + (n - x),随着x=9、8、7,分别为:  28、58、80……
           *    那么右下角沿着对角线到中心的规律为:(2 + 4 * (n - x - 1)) * (n - (n - x)) + 2(n - x) - 1,随着x=9、8、7,分别为:19、51、75
           *    以上的x均为行数。
           *   因此,我们要按照规律分别拆开来写代码,如上面括号地方为上半部分,|为下半部分,左右分别为左右两大部分
           *   由上半部分可以看到,(开始的地方是x=y的数字,末尾)的地方是n-x = y的地方
           *   而下半部分|开始的地方是(n - x - 1) =y的数字,末尾|的地方是x = y的地方
           *   
           *
           *对于奇数来说,其回形数中间剩一个数,对于偶数来说,其回形数中间剩一个环或0
           *4、写出代码:(本代码不涉及右下角规律,只涉及前三个规律)
、         *
           */
          
          
          
          
          
          
          
          Scanner scan=new Scanner(System.in);
          System.out.println("请输入一个值,我将为你输出该值下的回形数");//提示用户随机输入一个数
          int n = scan.nextInt();//获取回形数数值
          int[][]arry = new int[n][n];//二维数组为一个n * n的正方形
          int cycle = (n % 2 ==0)? n/2:(n+1)/2;//获取环数,奇数环数为(n+1)/2,偶数环数为n/2
          //上部分奇数
          int c = 0; //这里的c是留给后面循环条件+1试用的
          if(n % 2 != 0){  //若n为奇数,进入这个if循环
              for(int a = 0;a <= (n-1)/2;a++){  //这里的a相当于x,而(n-1)/2意思是奇数回形数的最大数在(n-1)/2行,这里等于号加不加都可以,这里不加的话就要在下部分的奇数加上,对于奇数回形数来说,左上和左下的规律在中间来说都是得到最大数!
                   for(int b = a;b < n - a;b++){ //这里的b相当于y,b = a即 x = y,对于第几行x,其相应括号结束的地方是n-x看不懂的话,看上面的分析
                        if(a == 0){  //a,b都从零开始
                             arry[0][b] = b + 1;//先把1 到n在第一行输出完了
                        }
                        else{
                             
                             arry[a][b] = 4 * a *(n - a) + 1 + c; //再把其他行的也输出完,这里的c其+1作用,首个数字c是0,第二个c是1,
                             c++;
                             
                        }
                   }
                             c = 0;//这里记得把c回0,不然会影响接下来其他部分的结果。
              }
          }
          //上部分偶数   //偶数和奇数的不同之处只是a的条件判断式子不同,其余一样
          if(n % 2 == 0){
              for(int a = 0;a <= n/2-1;a++){
                   for(int b = a;b < n - a;b++){
                        if(a == 0){
                             arry[0][b] = b + 1;
                        }
                        else{
                             
                             arry[a][b] = 4 * a *(n - a) + 1 + c;
                             c++;
                             
                        }
                   }
                             c = 0;
              }
          }
          //下部分奇数
          if(n % 2 != 0){
              for(int a = n - 1;a > (n-1)/2;a--){        //这里的条件判断看上面,如果上面没有等号这里记得加回,这里从最后一行开始往上输出
                   for(int b = n - a - 1;b < a + 1 ;b++){ //这里看不懂看上面分析,
                        arry[a][b] =(4 * (n - a) - 1) * a + n - a - c;//式子看解析,这里以左括号(第一个数字为起点,这里-c是因为下部分从左到右依次减一
                        c++;
                   }
                        c = 0;//赋值完记得归0
              }
          }
          //下部分偶数   ,这里和奇数的区别也就a的条件判断不同
          if(n % 2 == 0){
              for(int a = n - 1;a > n / 2 -1;a--){
                   for(int b = n - a - 1;b < a + 1 ;b++){
                        arry[a][b] =(4 * (n - a) - 1) * a + n - a - c;
                        c++;
                   }
                        c = 0;
              }
          }
          
          //左部分由下到上,列数为环数-1,即cycle-1
              for(int d = 1;d < cycle;d++){  //d为第几列,左边一共要补cycle - 1列,d等于n-a,d的意思就是从最后一行的第一个数开始往上的那一列
                   for(int a = n - d - 1; a >= d;a--){ //a为行数x
                        arry[a][d-1] = (4 * d - 1) * (n - d) + 1 + d + c; //d-1意思为:例如:在补第一列的时候int[x][y]的y固定都是0,因此为d-1
                                                     //而+1的意思是在下部分赋值的第一个数的上一个数,这个数比它大1,并以此为起点,起点的数,c此时为0,往上依次加一
                        c++;
                   }
                        c = 0;
              }
          //右部分由上到下,列数同样为环数-1
              for(int d = 1;d < cycle;d++){  //d为第几列,左边一共要补cycle - 1列,思想和左部分相似,只不过右部分是从上往下依次加一,左部分是从下往上依次加一
                   for(int a = d; a <= n - 1 - d;a++){
                        arry[a][n - d] = (1 + 4 * (d - 1)) * (n - (d - 1))  - (d - 1) + 1 + c;
                        c++;
                   }
                        c=0;
              }
     
          //输出一遍:
          for(int i = 0;i < n;i++){
              for(int j = 0;j < n;j++){
                   System.out.print(arry[i][j]+" "); 
              }
                   System.out.println();
          }         
                   
              
          
     }
}

结果显示: 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值