问题描述:

有n个人围成一圈,顺序排号。从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。

分析:

首先由用户输入人数n,然后对这n个人进行编号【因为如果不编号的话,我们就不能知道最后是哪位童鞋留下来了:)】

然后就开始了一圈一圈的循环,不断形成新的圈子,不断有人被淘汰,那么循环到什么时候截止呢?对只剩最后一个人,也就是说淘汰n-1了个人的时候,这个时候停止循环。

在实际情况中,应该是这n个人一开始围成了一个大圈子,然后随着不断的淘汰,圈子不断减小,最后剩下的那个人的一开始的编号就是我们要的结果。

我在用数组来表示这些人,因为进行了初始化,所以数组中元素的值都是原来的编号,因此我们只需要将被淘汰的人对应的数组元素的值设置为0即可。然后随着不断的循环,最后只剩下一个值不为0的数组元素,这个元素就是我们要的结果。

程序代码

#include<iostream>
using namespace std;
int main()
{
int i; //i用来记录数的那个数字
int k,j; //k用来记录淘汰的人数 ,j用来表示第j个人
int Array[10];
//对10个人进行编号
for(i=0;i<10;i++)
{
Array[i]=i+1;
}
i=1;
k=0;
/*因为n个人围成一个圈,所以当j>n的时候,j要除n取余,例如(n+1)%n=1
之所以要++j,而不是j++是因为要先加1再判断*/
for(j=0;k<9;j=++j%10)
{
if(Array[j]!=0)//当j对应的人没有被淘汰时参与进来,淘汰的直接忽略
{
if(i==3) //当j对应的人数到m的时候
{
k++; //淘汰人数加1
Array[j]=0; //对应数组中的数据置为0
i=1; //重新开始报数
}
else
{
i++; //当j对应的人数没有数到m,则进行下一个
}
}
}
for(i=0;i<10;i++)
{
if(Array[i]!=0)//通过上面的操作,所有淘汰的人员数组对应的值都为0,不为0的就是留下来的
{
cout<<"留下来的是,第"<<i+1<<"个人"<<endl;
}
}
cout<<endl;
return 0;
}

一些扩展

我们可以对上述程序做一些扩展,让用户输入总人数和用于淘汰的那个数字。



#include<iostream>
using namespace std;
int main()
{
int i; //i用来记录数的那个数字
int n,m;
int k,j; //k用来记录淘汰的人数 ,j用来表示第j个人
cout<<"请输入总人数n和用于淘汰的数字m:";
cin>>n>>m;
int *Array=new int[n];
//对n个人进行编号
for(i=0;i<n;i++)
{
Array[i]=i+1;
}
i=1;
k=0;
/*因为n个人围成一个圈,所以当j>n的时候,j要除n取余,例如(n+1)%n=1
之所以要++j,而不是j++是因为要先加1再判断*/
for(j=0;k<n-1;j=++j%n)
{
if(Array[j]!=0)//当j对应的人没有被淘汰时参与进来,淘汰的直接忽略
{
if(i==m) //当j对应的人数到m的时候
{
k++; //淘汰人数加1
Array[j]=0; //对应数组中的数据置为0
i=1; //重新开始报数
}
else
{
i++; //当j对应的人数没有数到m,则进行下一个
}
}
}
for(i=0;i<n;i++)
{
if(Array[i]!=0)//通过上面的操作,所有淘汰的人员数组对应的值都为0,不为0的就是留下来的
{
cout<<"留下来的是,第"<<i+1<<"个人"<<endl;
}
}
cout<<endl;
return 0;
}

11计信班赵哲

C++经典题目:约瑟夫环问题的更多相关文章

  1. Roman Roulette(约瑟夫环模拟)

    Roman Roulette Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. LA 3882 经典约瑟夫环问题的数学递推解法

    就是经典约瑟夫环问题的裸题 我一开始一直没理解这个递推是怎么来的,后来终于理解了 假设问题是从n个人编号分别为0...n-1,取第k个, 则第k个人编号为k-1的淘汰,剩下的编号为  0,1,2,3. ...

  3. HDU 3089 (快速约瑟夫环)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3089 题目大意:一共n人.从1号开始,每k个人T掉.问最后的人.n超大. 解题思路: 除去超大的n之 ...

  4. C++ 约瑟夫环问题

    约瑟夫环比较经典了 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直 ...

  5. 14.约瑟夫环问题[JosephusProblem]

    [题目] n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除 ...

  6. 【约瑟夫环变形】UVa 1394 - And Then There Was One

    首先看到这题脑子里立刻跳出链表..后来继续看如家的分析说,链表法时间复杂度为O(n*k),肯定会TLE,自己才意识到果然自个儿又头脑简单了 T^T. 看如家的分析没怎么看懂,后来发现这篇自己理解起来更 ...

  7. 【剑指offer】约瑟夫环问题

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27957407 题目描写叙述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小 ...

  8. POJ 2359 Questions(约瑟夫环——数学解法)

    题目链接: http://poj.org/problem?id=2359 题意描述: 输入一个字符串 按照下面的规则,如果剩下的最后一个字符是'?',输出"Yes",如果剩下的最后 ...

  9. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解

    剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...

  10. Joseph POJ - 1012 约瑟夫环递推

    题意:约瑟夫环  初始前k个人后k个人  问m等于多少的时候 后k个先出去 题解:因为前k个位置是不动的,所以只要考虑每次递推后的位置在不在前面k个就行 有递推式 ans[i]=(ans[i-1]+m ...

随机推荐

  1. 用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

    游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: ...

  2. origin与referer的区别

    referer显示来源页面的完整地址,而origin显示来源页面的origin: protocal+host,不包含路径等信息,也就不会包含含有用户信息的敏感内容 referer存在于所有请求,而or ...

  3. etcd -> Highly-avaliable key value store for shared configuration and service discovery

    The name "etcd" originated from two ideas, the unix "/etc" folder and "d&qu ...

  4. 剑指offer之 数组中出现次数超过一半的数字

    public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array==null||array.le ...

  5. MySQL- 常用的MySQL函数,指令等

    MySQL查看版本: status: 或者 select version(); //select @@version MySQL昨天, 一周前 ,一月前 ,一年前的数据 这里主要用到了 DATE_SU ...

  6. Hive- 表

    在hive中表的类型:管理表和托管表(外部表). 内部表也称之为MANAGER_TABLE,默认存储在/user/hive/warehouse下,也可以通过location指定:删除表时,会删除表的数 ...

  7. java:安装tomcat8/tomcat9(简单安装配置)

    java:安装tomcat8/tomcat9(简单安装配置) pache-tomcat-8.5.23(免安装板) 1.安装完成后右击我的电脑—属性—高级系统设置—环境变量, 在系统变量中添加以下变量 ...

  8. hdu--2111--Saving HDU(贪心)

    #include<iostream> #include<vector> #include<algorithm> using namespace std; struc ...

  9. COM组件的集合与包容

    集合与包容,实质就是组件之间的互相调用.即一个组件使用另一个组件的功能,达到代码复用的作用.只是这种复用是构建在二进制数据上的(因为被复用的组件常常以dll的格式存在),而不是像c++代码复用是以源文 ...

  10. pandas 学习 —— pivot table

    0. DataFrame 的 index.columns.values >> df = pd.DataFrame(np.arange(6).reshape(3, 2), index=['o ...