给定n,输出一个n*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
分析:
n=5,共需要n/2=2次循环
对第一圈
输出:1 2 3 4
输出:5 6 7 8
输出:9 10 11 12
输出:13 14 15 16
对第二圈
输出:17 18
输出:19 20
输出:21 22
输出:23 24
n%2==1时候,单独处理(n/2,n/2)的元素
输出25
Java源码如下
import java.io.*; public class ScrewMatrix { /** * @param args * @throws IOException * @throws NumberFormatException */ public static void main(String[] args) throws NumberFormatException, IOException { // TODO Auto-generated method stub int size; BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Input the matrix's size: "); size=Integer.parseInt(in.readLine()); int a[][]=new int [size][size]; //Initialize for(int i=0;i<size;i++) for(int j=0;j<size;j++) a[i][j]=0; int num=1,i,j; //Calculate for(i=0;i<size/2;i++){ //矩阵的尺寸为size×size的话,则需要循环size/2次,每次初始化一个圈 //计算圈上面的元素 for(j=i;j<size-i-1;j++){ a[i][j]=num++; } //计算圈右面的元素 for(j=i;j<size-i-1;j++){ a[j][size-i-1]=num++; } //计算圈下面的元素 for(j=size-i-1;j>i;j--){ a[size-i-1][j]=num++; } //计算圈左面的元素 for(j=size-i-1;j>i;j--){ a[j][i]=num++; } } //如果size为基数,则需要单独处理最中间的元素 if(size%2==1) a[size/2][size/2]=num; //print for(i=0;i<size;i++){ for(j=0;j<size;j++){ System.out.print(a[i][j]+" "); } System.out.println(); } } }
参考文献《程序员面试宝典》