luoguP1996 约瑟夫问题

/*
有n个人,编号为1到n,按顺序围城一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,
数到m的人再出列,以此类推,直到所有的人都出列,请依次输出出列人的编号。
输出要求:两个整数n和m,1<=m,n<=100
输出要求:n个整数,按顺序输出每个出列人的编号
*/
//考的是循环单向链表
#include<bits/stdc++.h>

struct node {//定义节点数据结构
	int data;
	node* next;
};

int main(){
	int n,m;
	scanf_s("%d %d", &n, &m);
	node* head, * p, * now, * prev;
	//创建一个头结点
	head = new node;
	head->data = 1;
	head->next = NULL;
	now = head;


	//创建剩余的结点
	for (int i = 2; i <= n; i++) {
		p = new node;
		p->data = i;
		p->next = NULL;
		now->next = p;
		now = p;
	}
	now->next = head;

	now = head;
	prev = head;

	//开始进行约瑟夫问题的解决
	while ((n--) > 1) {
		for (int i = 1; i < m; i++) {//此处不可以等于m,不如就是数到四就出列
			prev = now;
			now = now->next;

		}

		printf("%d ", now->data);//对于出列的打印其data
		prev->next = now->next;
		delete now;   //因为采用的是new创建的,故必须用delete进行删除
		now = prev->next;
	}

	printf("%d ", now->data);
	delete now;
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值