要求实现下面的效果:
输入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("输入的数据不合法!"); } } }