java第三次作业

这篇博客介绍了两个Java编程题目:1. N个人围成圈报数,数到M的人出局,按照顺序输出出局者编号;2. 对一个NxN的矩阵进行行列互换。详细阐述了问题解决思路和代码实现。
摘要由CSDN通过智能技术生成



1.

本题要求你简单模拟这个过程:N个人排成一圈,从第一个人报数,凡是数到M的人就走出队列(出局),然后继续报数,请按照顺序输出出局的人的编号。

魏远阳提供 可通过老师网站编译:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner cnn = new Scanner(System.in);
		int N = cnn.nextInt();
		int M = cnn.nextInt();
		int[] arrNum = new int[N];
		int index = 0;
		int count = 0;
		int j = 0;
		int k = 0;
		for (int i = 0; i < N; i++) {
			arrNum[i] = i + 1;
		}
		while (count < N) {
			j++;
			index++;

			if (j <= N) {
				k = j - 1;
			} else {
				k = j % N - 1;
				if (k < 0) {
					k = k + N;
				}
			}

			if (arrNum[k] == 0) {
				index--;
			} else {
				if (index % M == 0) {
					count++;
					if (count != N) {
						System.out.print(arrNum[k] + " ");
					} else {
						System.out.println(arrNum[k]);
					}
					arrNum[k] = 0;
				}
			}
		}
	}
}

本人做(供参考)未通过老师网站编译,但本地测试通过。

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sin = new Scanner(System.in);
		int N = sin.nextInt();
		int M = sin.nextInt();
		int[] persons = new int[N];
		//定义退出标记
		boolean[] flag = new boolean[N];
		for (int i = 0; i < persons.length; i++) {
			persons[i] = i + 1;
			flag[i] = false;
		}
		int jump = 0;
		int index = 1;
		while (jump < N) {
			for (int i = 0; i < persons.length; i++) {
				if (!flag[i]) {
					if (index % M == 0) {
						jump++;
						flag[i] = true;
						System.out.print(persons[i] + " ");
					}
					index++;
				}
			}
		}
	}
}

2.

编写一个程序,要求能够对一个NxN(N<10)的矩阵进行行列互换。每个矩阵的元素的取值为10~100的整数。

例如:

[95, 64, 85, 12]
[87, 43, 70, 23]
[87, 37, 26, 26]
[49, 95, 57, 21]

===> 

[95, 87, 87, 49]
[64, 43, 37, 95]
[85, 70, 26, 57]
[12, 23, 26, 21]

import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sin = new Scanner(System.in);
		int N = sin.nextInt();
		int[][] nums = new int[N][N];
		// 交换后的矩阵数组
		int[][] swapNums = new int[N][N];
		// 初始化输入矩阵
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < nums.length; j++) {
				nums[i][j] = sin.nextInt();
			}
		}
		// 矩阵交换
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < nums.length; j++) {
				swapNums[j][i] = nums[i][j];
			}
		}
		// 输出每行带有中括号的矩阵
		for (int i = 0; i < N; i++) {
			System.out.println(Arrays.toString(swapNums[i]));
		}
	}
}

3.

1填写在(3,2)(第三行第2列)的位置上;

2应当填写在其右下方格中,由于往下已经超出界限,因此变成位置(1,3);

3应该填写的位置往右往下都超出了界限,因此填入位置是(2,1);

4应放的位置被占了,因此放在3的上方位置(1,1);

5、6都按照规则放在其右下方格位置(2,2),(3,3);

7放在6的上方位置(2,3);

8因为右边越界,放在(3,1);

9放入(1,2);

4   9   2

3   5   7

8   1   6

类似的可以构造其它奇数阶的幻方。

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sin = new Scanner(System.in);
		int N = sin.nextInt();
		int[][] nums = new int[N][N];
		// 行坐标
		int x = N;
		// 列坐标
		int y = N / 2 + 1;
		nums[x - 1][y - 1] = 1;
		for (int i = 2; i <= N * N; i++) {
			// 设置当前坐标取右下角
			x++;
			y++;
			// 临时坐标
			int tmpX = x;
			int tmpY = y;
			if (x > N) {
				tmpX -= N;
			}
			if (y > N) {
				tmpY -= N;
			}
			// 判断应放的位置是否被占
			if (nums[tmpX - 1][tmpY - 1] != 0) {
				// 确定上方坐标
				x -= 2;
				y--;
			} else {
				x = tmpX;
				y = tmpY;
			}
			nums[x - 1][y - 1] = i;
		}
		// 输出
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				System.out.print(nums[i][j]);
				// 控制最后逗号输出
				if (j < N - 1) {
					System.out.print(",");
				}
			}
			System.out.println();
		}
	}
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值