C语言题,n个人围成一圈,从第一个人开始喊123喊到3的就退出,一圈一圈往下绕喊,剩下就两个人

九度OJ:《剑指Offer:名企面试官精讲典型编程题》(7)
题目描述:
每年六一儿童节都会准备一些小礼物去看望孤儿院的小朋友今年亦是如此。作为的资深元老自然也准备了一些小游戏。其中有个游戏是这样的首先让小朋友们围成一个大圈。然后他随机指定一个数让编号为的小朋友开始报数。每次喊到的那个小朋友要出列唱首歌然后可以在礼品箱中任意的挑选礼物并且不再回到圈中从他的下一个小朋友开始继续报数这样下去直到剩下最后一个小朋友可以不用表演并且拿到名贵的名侦探柯南典藏版名额有限哦。请你试着想下哪个小朋友会得到这份礼品呢?
输入有多组数据。
每组数据一行包含个整数分别表示小朋友的人数编号和指定的那个数如上文所述。如果则结束输入。
对应每组数据输出最后拿到大奖的小朋友编号。
样例输入:
样例输出:
本题的意思就是输入n,m,n个人围成一圈,编号为1~n,从1开始报数,数到m的人出列,再从下一个人开始数数,又从1开始,数到m出列,问最近出列的人的编号!其实本题就是经典的约瑟夫环问题!请参考:
以下是AC代码:
#include &algorithm&
#include &cmath&
#include &set&
#include &vector&
int main()
int n,m,i,
while(scanf(&%d&,&n) == 1)
scanf(&%d&,&m);
for( i = 2;i &= i++)
ans = (ans + m) %i;
printf(&%d\n&,ans + 1);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19697次
排名:千里之外
原创:20篇
(1)(1)(19)(6)约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的,就是将一个链表的尾元素指针指向队首元素。
p-&link=head
  解决问题的核心步骤:(程序的基本算法)
  1.建立一个具有n个链结点,无头结点的循环链表;
  2.确定第1个报数人的位置;
  3.不断地从链表中删除链结点,直到链表为空。
  void JOSEPHUS(int n,int k,int m)
//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
  LinkList p,r,
  for(int i=0;i&n;i++)
  p=(LinkList)malloc(sizeof(LNode));
  p-&data=i;
  if(list==NULL)
  list=p;
  r-&link=p;
  p-&link=
  for(i=0;i&k;i++)
  while(p-&link!=p)
  for(i=0;i&m-1;i++)
  r-&link=p-&
  printf("被删除的元素:M ",p-&data);
  free(p);
  printf("\n最后被删除的元素是:M",P-&data);
C语言模拟 约瑟夫环
  #include &stdio.h&
  #define M 10
  #define N 5
  #define START 0
  void main(void)
  int a[M],i=0,k,count=0;
  while(i++&M)
  a[i-1]=i;
  for(i=START;count&=M-1;count++)
  for(k=1;k&=N;a[i++]&&++k)
  if(i&M-1)
  printf("%d ",i?a[i-1]:a[M-1]);
  a[(i?(i-1):(M-1))]=0;
  getch();
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。c语言20题上机题目_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c语言20题上机题目
上传于||文档简介
&&c​语​言0​题​上​机​题​目​,​C​语​言​实​验​考​试0​题​,​老​师​给​的​!
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩18页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢有n个人围成一圈,顺序排号。从第一个人开始报数... - 开源中国社区
当前访客身份:游客 [
当前位置:
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
最后把思路和代码都发一下,小妹在此谢过了。
共有12个答案
<span class="a_vote_num" id="a_vote_num_
如一楼所说,这是约瑟夫环。问题不复杂,就是站成一个圈,数数,数到了,就踢出去,重新排好队继续数。剩下最后的一个。
一个简单的问题,引来如此之多的人回答。有两个重大的因素,性别和头像。殊不知屏幕背后的妹子实际情况如何。说不定是个抠脚大汉……
不可否认,以妹子的角色进入社交网络比较好混……
<span class="a_vote_num" id="a_vote_num_
艺术系妹子居然搞上开发了。。。答案请参见:
--- 共有 1 条评论 ---
我不搞开发,只是学校有C语言课,不得已来此提问。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
给你一个我10年的思路:初始化一个有N个元素的数组,然后循环遍历赋值,1、2……m,赋值之前,判断是否为m,如果为m,继续判断下一个元素,这里赋值,也是循环赋值的,不能漏掉。如此这般,直到n-1个元素都是m,剩下的那个不是m的元素的下标,就是你要找的!看明白的+1吧!
算法,要考虑时间复杂度和空间复杂度的!
网上有最简单的算法,4、5行代码搞定,什么数组啊,集合啊,统统不需要,只需要计算。
<span class="a_vote_num" id="a_vote_num_
引用来自“php_by”的答案不过你tm真是小妹么
不过你tm的真是小妹么+1
--- 共有 1 条评论 ---
不是。我是大姐。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
很简单,循环链表就能搞定,大一就搞定了这题目。遇到了3就断开该结点释放它,前后连接上去就ok了。
<span class="a_vote_num" id="a_vote_num_
c 可以自己写链表实现,算法楼上都有人说了
c++ 可以用 std的 list 实现,算法楼上已给出
java 楼上已经楼上已贴代码了
--- 共有 6 条评论 ---
: 。。。。百度百科还真有c代码啊。。服了。
(3年前)&nbsp&
: 这你都没看明白,人家明显问的都是C的问题,而且野鬼似乎也很来劲.最近又在写书,这种问题都是C书中应该给出的,可以说野鬼回答这种问题都是手到擒来,都是现成的.这么看都比我回来要来得更合适更权威嘛.
(3年前)&nbsp&
: 我记得此故事上一节是
请你做私人辅导,你貌似没有拒绝。本节开头你没出现,天气这么热,太阳这么大,色狼这么多,你也忍心让人家小姑娘家在门外等你半天,,
都看不下去了
(3年前)&nbsp&
: 对于这种标准国际问题,百度百科都给出代码了,还有什么好回答的呢? /view/717633.htm
(3年前)&nbsp&
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
import java.util.ArrayL
import java.util.L
import java.util.ListI
public class Main {
public static void main(String[] args) {
final int n = 10;
final int flag = 3;
List&Integer& mans = new ArrayList&Integer&();
for (int i = 0; i & i++) {
mans.add(i + 1);
System.out.println(&初始化编号为& + mans + &的& + mans.size() + &个人围成一圈&);
ListIterator&Integer& iter =
int k = 1;
iter = mans.listIterator();
while (iter.hasNext()) {
int i = iter.next();
if (k++ % flag == 0) {
System.out.println(&编号& + i + &的人退出圈子&);
iter.remove();
} while (mans.size() & 1);
System.out.println(&剩下编号为& + mans + &的& + mans.size() + &个人&);
运行结果:
--- 共有 4 条评论 ---
: 好吧,当我没发过
(3年前)&nbsp&
运行不了。你这个好像不是吧。
(3年前)&nbsp&
: 您别矫情了,来点实际的!
(3年前)&nbsp&
容我矫情的说一句:这种题目用list就失去意义了
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
天涯翘佳人&
--- 共有 1 条评论 ---
我的QQ空间。
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
只发思路哦--用队列,数到3的出列,其余的出列并入列;用数组,数到3的删除,后面的前移即可。
--- 共有 2 条评论 ---
: 用队列的话,可以理解成所有人排成一条长队,最前面的人报数,报到1,2的就跑到队尾去,报到3的就离开,如此循环
(3年前)&nbsp&
能说的直白点儿吗?
(3年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
婷婷001的其它问题}

我要回帖

更多关于 c语言输出一个人名字 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信