循环数组java实现

import java.lang.*;


public class xunhuanshuzu{
public static void main(String args[]){
int n = 7; //二维数组的维数
makeCril(n);
}
//输入n*n二维数组的维数n,得到循环数组
public static void makeCril(int n){
if(n > 0){ //判断维数是否大于0,小于0不予计算
int a[][] = new int[n][n]; //创建一个int型数组
for(int s = 0; s < n; s++){ //维数组赋初值0,用于下面的判断
for(int m = 0; m < n; m++){
a[s][m] = 0;
}
}
int i = 0; //当前判断元素的横坐标
int j = 0; //当前判断元素的纵坐标
int t = 1; //标记要填的数字1~n*n
int m1 = 0; //m1,m2标记最大元素n*n的位置
int m2 = 0;
if(n % 2 == 0){ //维数为偶数时最大数位置计算
m1 = n / 2;
m2 = m1 - 1;
}else{ //维数为奇数数时最大数位置计算
m1 = n / 2;
m2 = m1;
}
a[m1][m2] = n * n; //把最大数放在计算好的位置上
//最大数的位置为循环数组最后的位置,判断当没有达到最后的位置的时候
while(i != m1 || j != m2){
//向左填数
while(j < n && a[i][j] == 0){ //当向右填数时,只有j下标变大,范围最大为0~n,且当前a[i][j]没有填数,即a[i][j]=0
a[i][j] = t++; //填数
j++; //向右移一位
}
j--; //最后一定是多移了一位,要要移回来
if(i < n - 1){ //向右完成之后便是向下,所以i<n-1时,i向下移动一位
i++;
}
//向下填数
while(i < n && a[i][j] == 0){ //当向下填数时,只有i下标变大,范围最大为0~n,且当前a[i][j]没有填数,即a[i][j]=0
a[i][j] = t++; //填数
i++; //向下移一位
}
if(i == m1 && j == m2){ //判断是否到了最大数的位置,是的话跳出循环,推断得出,
break; //不会再向右填数的时候到达最大数的位置,故向左填数时,不必判断(有待检验)
}
i--; //最后一定是多移了一位,要要移回来
if(j > 0){ //向下完成之后便是向右,所以i>0时,i向左移动一位
j--;
}
//向右填数
while(j >= 0 && a[i][j] == 0){
a[i][j] = t++;
j--;
}
if(i == m1 && j == m2){
break;
}
j++;
if(i > 0){
i--;
}
//向上填数
while(i > 0 && a[i][j] == 0){
a[i][j] = t++;
i--;
}
if(i == m1 && j == m2){
break;
}
i++;
if(j < n - 1){
j++;
}
}
//输出填好的数组
for(int s = 0; s < n; s++){
for(int m = 0; m < n; m++){
System.out.print(formatStr(a[s][m]+""));
}
System.out.println();
}
}
}
//令数组元素的长度一致
public static String formatStr(String str){
if(str.length() < 6){
for(int i = 0; i < 6-str.length(); i++){
str = str + " ";
}
}
return str;
}

}


当输入7时的运行结果:



输入4时的运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值