整体思路图
规律解释及代码
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();
}
}
}
结果显示: