问题描述:

有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. Filebeat 导入 Elasticsearch 的方法

    Filebeat 导入 Elastaticsearch 的方法 1. 什么是Filebeat?到底是干什么的? Filebeat说实话,就是一个日志监控分发器,类似tail -f这样去监控某个日志,或 ...

  2. CSS3分享按钮动画特效

    在线演示 本地下载

  3. 剪辑的楼天城的ACM之路

    楼天城楼教主的acm心路历程(剪辑) 利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个回顾.昨天是GCJ2006 的回忆,今天时间上更早一些吧,我现在还清晰记得3 年 ...

  4. Qt窗口屏幕居中显示

    转自--> http://blog.chinaunix.net/uid-20718335-id-364404.html 窗口的屏幕居中显示问题,在各开发工具中原理相同,首先使用特定的方法得到显示 ...

  5. 大话设计模式--桥接模式 Bridge -- C++实现实例

    1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...

  6. Javascript-- jQuery 核心

    jQuery中each方法的应用 jQuery中有个很重要的核心方法each,大部分jQuery方法在内部都会调用each,其主要的原因的就是jQuery的实例是一个元素合集 如下:找到所有的div, ...

  7. 实现stack 加上·getMin功能 时间复杂度为O(n)

    package com.hzins.suanfa; import java.util.Stack; /** * 实现stack 加上·getMin功能 时间复杂度为O(n) * @author Adm ...

  8. linux命令学习笔记(3):pwd命令

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时, 你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置 ...

  9. 关于android 图片加载优化

    android应用对图片处理算是比较频繁的了,尤其是在程序加载大量图片和高分辨率图片时,最容易产生oom异常,下面是个人平时一些省内存加载方法 方法一: public Bitmap decodeFil ...

  10. OpenCV-Python 霍夫直线检测-HoughLinesP函数参数

    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, ...