大一C语言总结贴(持更) Part 8 约瑟夫问题

【问题描述】古代某法官判决n名犯人死刑,他将犯人排成一个圆圈,然后从第s个人开始从1报数,每数到第m个犯人,就把他拉出来处决,然后再从1报数。到剩下最后一个人时,就把他赦免。编写程序,输入n、 s、 m,
给出处决顺序,以及被赦免者编号。
【输入形式】三个整数n, s, m。其中1 <= n, s, m <= 1000。
【输出形式】处决顺序和被赦免者编号。都以空格隔开。
【样例输入】

5 1 3
【样例输出】

3 1 5 2 4

代码

#include <stdio.h>
#include <malloc.h>
void joseph(int n, int s, int m);
void joseph(int n, int s, int m) 
{
	int alive = n;		//幸存人数 
	int number = 1-s;			//初始化number(s相当于多计次数) 
	int index = 0;			//下标,为总人数-1 
	int *circle = NULL;		//根据需求设为循环数组,存储每个人 
	circle = (int *) calloc(sizeof(int), n);//用calloc()函数申请得到的空间,自动初始化每个元素为0,0表示存活,1表示淘汰
	while(alive > 0) //只要幸存人数大于0,则一直进行循环 
	{
		number += 1 - circle[index];	//计数,遇到1则人死了,不计入 
		if(number == m) //当number=m时,就要淘汰当前这个人
		{		
			alive == 1 ? printf("%d ", index + 1) : printf("%d ", index + 1);//淘汰编号 
			circle[index] = 1;            //把这个人的状态从在圈内"0"改为不在圈内"1" 
			alive--;                    // 幸存人数-1
			number = 0;                  //归零,为下一轮作准备 
		}
		index = (index + 1) % n;	
	}
	free(circle);
}

int main() 
{
	int n, s, m;  //输入总人数n,开始数s,死亡数m 
	scanf("%d%d%d", &n, &s, &m);
	joseph(n, s, m);//应用函数 
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值