java关于输出n*n的序列有关问题
要求实现下面的效果:
输入5:
输出结果为:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
输入6:
输出结果为:
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
import java.util.Scanner;
/**
* @description 实现功能见运行结果
* @author srong
* @version 1.0 2011-9-9
*/
public class TestNum {
public static void main(String[] args) {
//定义标准输入流,与System.in关联
Scanner in = new Scanner(System.in);
System.out.println("请输入一个任意大于0的整数(若输入的值是大于0的小数,则只取整数舍去小数):");
//定义用户输入的值,用户可以输入小数,整数,但是num只存取整数值
//尚未控制不允许输入字符,如果输入字符后台会抛错
int num = (int)in.nextDouble();
//定义一个num长num宽的二维数组
int numbers[][] = new int[num][num];
int i = 0;//i控制循环次数
int k = 0;//k控制行
int j = 0;//j控制列
int temp = 0;//temp存放当前得到的值
//判断num的值是否大于0
if (num > 0) {
//num*num是在整个矩阵最中心的位置,而得到这个值是在最后才得到的,并且通过众多的举例可得到共循环num/2+1次
for (; i < num / 2+1; i++) {
//因为整个矩阵是按行列循环,每循环完一个正方形,行列的的下标相等
k = i;
for (j = i; j < num - i; j++) {//按从左到右,计算每行的各值
temp = temp + 1;
numbers[k][j] = temp;
}
//从左到右,每行的最后一个值得到后,则列下标不变,行下标加1
k ++;
for (; k < j; k++) {//从上到下,计算每列的各值
temp = temp + 1;
numbers[k][j - 1] = temp;
}
//从上到下,每一列的最后一个值得到后,则行下标不变,列下标减1
k = j - 1;
for (j = j - 2; j > i - 1; j--) {//从右到左,计算每行的各值
temp = temp + 1;
numbers[k][j] = temp;
}
//从左到右,每一行的最后一个值得到后,则列下标不变,行下标依次减1
j = j + 1;
k = k - 1;
for (; k > i; k--) {//从下到上,计算每列的各值
temp = temp + 1;
numbers[k][j] = temp;
}
}
//格式化数据二维数据的值
for (i = 0; i < num; i++) {
for (j = 0; j < num; j++) {
System.out.printf("%3d", numbers[i][j]);
}
System.out.println();
}
} else {
System.out.println("输入的数据不合法!");
}
}
}