一天一练之算法——约瑟夫问题

子选王

一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

#include <stdio.h>
#include <stdlib.h>

int JosephusFun(int nAllCount,int nStep)
{
	int *npIndex=NULL , i=0 ,nCount=0;

	npIndex=(int *)malloc(sizeof(int)*nAllCount);

	for (i=0;i<nAllCount;i++)
	{
		npIndex[i]=i+1;
	}
	//打印报数前的顺序
	printf("报数前序号为:");
	for (i=0;i<nAllCount;i++)
	{
		printf("%d",npIndex[i]);
		printf("  ");
	}
	printf("\n");

	printf("=======================================\n");
	printf("报数出列顺序为:\n");
	i=-1;
	while(nCount<nAllCount)        //全部出列后循环结束
	{
		int nIndex=0 ;

		while(nIndex<nStep)        //报数等于步距时出列
		{
			i=(i+1)%nAllCount;      //循环报数

			if (npIndex[i]==0)      //如果当前序号已出列,则下一位报数
			{
				continue;
			}
			nIndex++;              //报数一次
		}

		//打印当前出列的编号
		printf("第%d个出列的为:%d\n",nCount+1,npIndex[i]);
		npIndex[i]=0;
		nCount++;
	}
	printf("=======================================\n");

	return 0;
}

int main()
{
	int nAllCount=0,nStep=0;

	printf("请输入总个数:");
	scanf("%d",&nAllCount);

	printf("请输入出列步长:");
	scanf("%d",&nStep);
	printf("\n");

	JosephusFun(nAllCount,nStep);

	return 0;
}
时间: 2024-08-30 16:41:11

一天一练之算法——约瑟夫问题的相关文章

基本算法——约瑟夫环问题

关于约瑟夫环问题,我们可以从两种思路去实现,一种是用数组,另一种是采用链表. 用数组方法实现代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define M 8 5 int find(int *arr, int len); 6 int main(int argc, char* argv[]) 7 { 8 int size = atoi(argv[1]); 9 int* arr

[经典算法]约瑟夫问题

题目说明: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. 题目解析: 约瑟

趣味算法--约瑟夫环问题

问题描述 已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌上.指定编号为k的人开始从1报数,数到m的那个人出列:出列那个人的下一位又从1开始报数,数到m的那个人出列:以此规则重复下去,直到圆桌上的人全部出列. 分析解决 解决方法主要有逻辑分析.数学分析法. 逻辑分析:就是按照游戏规则一个个报数,报到m的人出局,结构层次简单清晰明了.这种方式实现主要采用顺序表实现 数学分析:采用数学方式归纳统计分析出每次出局人的规律,直接得出每次出局的人,然后以代码实现.这种方法需要较强的数学分析

[算法天天练]插入排序算法

#include <stdio.h> void show(int arr[], int length) { for(int i=0; i<length; i++) { printf("%d ", arr[i]); } printf("\n"); } void s_insert(int arr[], int length) { if(length < 0) return ; for(int i=1; i<length; i++) { in

hihoCoder - hiho一下 第二十七周 - A - 最小生成树二&#183;Kruscal算法

题目1 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成了--小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需

25道经典Java算法题

即使做web开发,也会遇到各种各种需要解决的算法问题,本文节选部分经典练手算法,并提供相关参考答案,希望对你有所帮助[程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class test01 { public static void main(String[] args) { int f1=1,f2=1,f; int M=30; System.

约瑟夫问题 -- python实现

问题描述 N个人围成一个圈, 从第一个人开始报数, 报到M的人出圈, 剩下的人继续从1开始报数, 报到M的人出圈;如此往复, 直到所有人出圈. 列表解决 def solution_list(n, m): """ 初始化一个长度为n的列表, 默认值为True. 当某个元素出圈时, 将其置为False. 循环迭代这个列表, 遇到值为False的元素则跳过, 当列表中全为False时表示所有人 都已出圈. """ # 初始化列表 people = []

201. Non Absorbing DFA

题意好难看懂的说... 有限状态自动机DFA是这么一个有序组<Σ, U, s, T, phi>:Σ代表输入字符集,表示此自动机的工作范围:U代表所有的状态集合:s是初始状态:T是最终状态:phi代表转移函数,定义为phi : U × Σ → U. 利用DFA进行字符串识别是要你做这么一件事情:The input of the automation is the string α over Σ. Initially the automation is in state s. Each step

Java学习之开篇—个人随想

现在大三上学期了,家里希望考研,不然觉得我这学校不好找工作,我自己觉得工作还是靠自己,学校就像给人第一眼感觉那样,虽然重要但也只会吸引HR多看两眼,真正留得住HR的还是要有拿的出手的技能. 当初凭着对计算机的热爱硬是选了了这个专业,大一刚进学校什么都不懂,纯粹一个计算机小白,然后大一上学期学了c语言,老师是湘大信工院四大杀手之一,因为又是学校ACM/ICPC比赛教练所以基本让我们用c在oj上刷算法题,刚开始对我有点难,记得当时军训(我们入学1个月后才军训)休息时我拿出手机记事本敲代码:练步时脑子