设有n个人围成一圈,从第一个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数...

Java编程实现:设有n个人围成一圈,从第一个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,...,如此反复到所有人出列为止。设n个人的编号为1到n,打印出出列的顺序。
package test;

public class Test {
	public static void main(String[] args) {
		play(10,7);
	}
	
	
	private static boolean same(int[] person,int l,int n) {
		for (int i=0; i<l; i++) {
			if(person[i] == n) {
				return true;
			}
		}
		return false;
	}
	
	public static void play(int playerNum, int step ) {
		int[] person = new int[playerNum];
		int counter = 1;
		while(true) {
			if(counter > playerNum*step) {
				break;
			}
			for(int i=1;i<=playerNum;i++) {
				while(true) {
					if(same(person,playerNum,i) == false) {
						break;
					}else {
						i = i+1;
					}
				}
				if(i > playerNum) {
					break;
				}
				if(counter%step == 0) {
					System.out.println(i+" ");
					person[counter/step -1] = i;
				}
				counter +=1;
			}
		}
		System.out.println();
	}
}

序。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本系统的研发具有重大的意义,在安全性方面,用户使用浏览器访问网站时,采用注册和密码等相关的保护措施,提高系统的可靠性,维护用户的个人信息和财产的安全。在方便性方面,促进了校园失物招领网站的信息化建设,极大的方便了相关的工作人员对校园失物招领网站信息进行管理。 本系统主要通过使用Java语言编码设计系统功能,MySQL数据库管理数据,AJAX技术设计简洁的、友好的网址页面,然后在IDEA开发平台中,编写相关的Java代码文件,接着通过连接语言完与数据库的搭建工作,再通过平台提供的Tomcat插件完信息的交互,最后在浏览器中打开系统网址便可使用本系统。本系统的使用角色可以被分为用户和管理员,用户具有注册、查看信息、留言信息等功能,管理员具有修改用户信息,发布寻物启事等功能。 管理员可以选择任一浏览器打开网址,输入信息无误后,以管理员的身份行使相关的管理权限。管理员可以通过选择失物招领管理,管理相关的失物招领信息记录,比如进行查看失物招领信息标题,修改失物招领信息来源等操作。管理员可以通过选择公告管理,管理相关的公告信息记录,比如进行查看公告详情,删除错误的公告信息,发布公告等操作。管理员可以通过选择公告类型管理,管理相关的公告类型信息,比如查看所有公告类型,删除无用公告类型,修改公告类型,添加公告类型等操作。寻物启事管理页面,此页面提供给管理员的功能有:新增寻物启事,修改寻物启事,删除寻物启事。物品类型管理页面,此页面提供给管理员的功能有:新增物品类型,修改物品类型,删除物品类型。
### 回答1: 这是一个依次一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人出列,...直到剩余所有人全部出列为止的问题。设有n个人的编号分别为1,2,...,n,那么设第i个人为编号为i的人,那么编码为1~n的个人依次出列为止。设第i个人的编号为序号i,打印出列的顺序。 ### 回答2: 这道题是一道经典的约瑟夫问题,可以用循环队列来解决。 首先将n个人的编号放入队列中,并从队首开始报数,每数到m时,将该位置的人出列。然后从出列位置的下一个人重新开始报数,直到最后一个人出列为止。 具体来说,可以使用一个数组queue来表示队列,queue[i]存储第i个人的编号。一个指针front表示队首位置,一个指针rear表示队尾位置。初始时,front=rear=0。 首先将所有人的编号放入队列中: ``` for(int i=1; i<=n; i++) { queue[rear++] = i; } ``` 然后开始报数,每数到m时将出列位置的人出队: ``` int cnt = 0; // 当前已数的人数 while(front != rear) { // 队列非空时循环 int cur = queue[front]; // 当前出列的人 if(++cnt == m) { // 数到m时出列 printf("%d ", cur); front++; // 出列位置后移 cnt = 0; // 重新开始计数 continue; } queue[rear++] = cur; // 报数未到m时,当前人从队尾进队 front++; // 队首后移 } ``` 最后所有人都出队时,就得到了出列的顺序。 完整代码如下: ### 回答3: 这是一个经典的约瑟夫问题,可以使用循环链表来模拟解决。将所有的人编号依次插入一个循环链表中,然后从头结点开始,依次遍历链表进行操作。具体步骤如下: 1. 定义一个循环链表结构体,包含员变量:编号num,指向下一个结点的指针next。 2. 创建一个有n个结点的循环链表。 3. 定义两个变量:count和index,表示数数的个数和当前结点的下标(从0开始)。 4. 从头结点开始,依次遍历链表进行操作: a. 如果当前结点是最后一个结点,则将index重置为0。 b. 如果count等于m-1,则删除当前结点,并将该结点的下一个结点作为新的当前结点,同时打印该结点的编号。 c. 如果count不等于m-1,则将count加1,继续遍历下一个结点。 5. 重复步骤4,直到链表为空。 6. 打印所有人出列的顺序。 具体代码如下: ```c #include <stdio.h> #include <stdlib.h> // 定义循环链表结构体 typedef struct Node { int num; // 编号 struct Node *next; // 下一个结点指针 } Node; int main() { int n, m; printf("请输入人数n和报数的数m:"); scanf("%d%d", &n, &m); // 创建循环链表 Node *head = (Node *)malloc(sizeof(Node)); Node *p = head; for (int i = 1; i <= n; i++) { Node *node = (Node *)malloc(sizeof(Node)); node->num = i; p->next = node; p = node; } p->next = head->next; // 循环链表尾结点指向头结点 int index = 0, count = 0; while (head->next != head) { // 循环链表不为空 if (index == n) { // 如果当前结点是最后一个结点,则将下标重置为0 index = 0; } if (count == m - 1) { // 如果数数的个数等于m-1,则删除当前结点 Node *q = head->next; for (int i = 0; i < index - 1; i++) { // 找到上一个结点位置 q = q->next; } printf("%d ", q->next->num); // 打印出列编号 Node *temp = q->next; // 删除当前结点 q->next = q->next->next; free(temp); count = 0; // 重置计数器 } else { // 继续遍历下一个结点 index++; count++; head = head->next; } } free(head); // 释放头结点内存 return 0; } ``` 例如,当输入n=8,m=3时,最后的出列顺序为:3 6 1 5 2 8 4 7。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值