算法:约瑟夫环问题
2016-10-01 22:26
155 查看
[b]算法:约瑟夫环问题[/b]
【写在前面】
约瑟夫环问题是一道经典的算法题。
【问题描述】
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从第一个人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,求最后一个出圈的人的标号。
【代码】
for(int i=1;i<n;i++) //那个值不为0元素的下标的就是最后一个出圈的人的序号
{
if(people[i]!=0)
{printf("目标为%d\n",i);break;}
}
【写在前面】
约瑟夫环问题是一道经典的算法题。
【问题描述】
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从第一个人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,求最后一个出圈的人的标号。
【代码】
void JOSEF(int n,int m) //:n个人,m出列 { int people[n+1]; //我们定义的数组大小为n+1,因为我们不想涉及到0的操作,我们只取1到n这个范围内的标号,忽略0 for(int i=1;i<=n;i++) people[i]=i; //将数组内(除0)的每一个元素进行初始化,其实非0即可,值无所谓。 int flag=n-1; //我们要在数组里面删除多少个元素呢?答案是n-1个。剩下的一个为最后出圈的那一个 int p=1; //用来指示元素下标 int count=0; //计数器 while(flag) //没有删完的情况下继续 { if(people[p]==0) //如果p所指的元素为0,表示该元素已经出圈,可以跳过 { if(p==n) //这段代码就是让尾部连接头部 p=1; else p++; continue; } count++; //找打一个不为0的元素 if(count==m) //如果我们找够m个,就将这个元素出圈,也就是设为0 { people[p]=0; flag--; //待出圈的元素-1 count=0; //重新开始数 } if(p==n) //这段代码就是让尾部连接头部 p=1; else p++; }
for(int i=1;i<n;i++) //那个值不为0元素的下标的就是最后一个出圈的人的序号
{
if(people[i]!=0)
{printf("目标为%d\n",i);break;}
}
相关文章推荐
- 常用算法(C#): 约瑟夫环问题
- 约瑟夫环问题算法
- 【算法题目】约瑟夫环问题
- 北航算法作业一 约瑟夫环问题
- 北航算法作业一 约瑟夫环问题
- C/C++面试之算法系列--约瑟夫环:每隔两个循环删除数组元素,求最后删除者的下标问题
- 算法训练 筛选号码 (约瑟夫环问题)
- 每天一道算法题(23)——约瑟夫环问题
- [算法]约瑟夫环问题
- 约瑟夫环问题(根据算法竞赛入门经典一题改编)
- c# 算法-------约瑟夫环问题
- [c#算法和数据结构]约瑟夫环问题
- 用数学算法解决约瑟夫环问题
- 每天一道算法题(23)——约瑟夫环问题
- 约瑟夫环问题的数学优化算法-(应用于System Overload zju1088)
- 约瑟夫环问题算法集锦
- 赌博算法之约瑟夫环问题(JAVA)
- 经典算法之约瑟夫环问题
- 算法学习笔记之约瑟夫环问题
- 4.3.3 算法之美--约瑟夫环的问题