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();
}
}
}