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("输入的数据不合法!");
??}
?}
}