c语言,有n个人围成一个圈,顺序排号,从第一个开始报数(1到3),凡报到3的退出圈子问最后留下的人

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言,有n个人围成一个圈,顺序排号,从第一个开始报数(1到3),凡报到3的退出圈子问最后留下的人相关的知识,希望对你有一定的参考价值。

c语言,有n个人围成一个圈,顺序排号,从第一个开始报数(1到3),凡报到3的退出圈子问最后留下的人是原来的哪位?

参考技术A # include "stdio.h"
# define N 10
void main()

int a[N],n=N,i=0,k=0;
for(i=0;i<N;i++)
a[i]=i+1;
i=0;
while(n>1)

i=i%N;
if(a[i]!=0)
k++;
if(k==3)

a[i]=0;
k=k%3;
n--;

i++;

for(i=0;i<N;i++)
if(a[i]!=0)
break;
printf("%d\\n",a[i]);

追问

高手那i=i%N用来干嘛呢?

高手做个朋友呗!

本回答被提问者采纳
参考技术B #include<stdio.h>
int baoshu(int m,int a[]);
int main()

int a[100],m,i;
printf("一共多少人?");
scanf("%d",&m);
for(i=0;i<m;i++)

a[i] = i+1;

printf("\n剩下的学生的编号是%d\n",baoshu(m,a));

int baoshu(int m,int a[])

int i=0,j=0,n=m;
while(n>1)


while(a[i]==0)

++i;
if(i==m)
i=0;


if(++j%3==0)

j=0;
a[i] = 0;
n--;

++i;
if(i==m)
i=0;


while(a[i]==0)

++i;
if(i==m)
i=0;

return a[i];
参考技术C 这是约契夫问题追答

有多种解法,但归纳为两种,一种面向过程,按照游戏流程写代码,一种面向结果,从结果推测到开始,不管游戏流程

现在准备睡觉了。。。给不了你代码

你可以去百度上搜索

这个问题的代码很多

你也可以收藏我哦,看我的回答,我曾经给人回答过这个问题,那个里面有代码的哦,亲

觉得好的话采纳一下呗亲

C++ 结构有n个人围成一圈,顺序排号。从第一个开始报数(从1到3报数),凡报到3的人退出圈子,(用结构)

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

参考技术A int g_all_num = 0;//记录当前所有人数
int g_now=0;//人数计数 将g_now==3 的人的
struct Number

bool bOut;//是否已退出

int iSelf;//记录自己位置
Number* next;//指向下一个
;
用上面结构体做个链表,添加所有人,做成圆形链表
//一次踢人判断如下
Number* tNumber = ***;//链表的元素
if(g_all_num==1)

if(!tNumber->bOut)//这个人未被T



g_now++;
if(g_now == 3)


g_all_num --;

tNumber->bOut = true;//T掉这个人
g_now = 0;


// 这边跳到链表下个元素 再进行t人判断


else

//已经结束 当前这个的为最后剩下的

参考技术B //创建含有n个节点的环形链表,每次在这个链表中删除第m个节点,返回最后剩下的节点。
#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>
using namespace std;
int fun(unsigned int n, unsigned int m)

if (n<1 ||m<1)

return -1;

unsigned int i = 0;
list<int>numbers;
for (i = 0;i<n; ++i)

numbers.push_back(i);

list<int>::iterator current = numbers.begin();
while (numbers.size()>1)

for (int i = 1;i<m; ++i)

current++;
if (current == numbers.end())

current = numbers.begin();


list<int>::iterator next = ++current;
if (next == numbers.end())

next = numbers.begin();

--current;
numbers.erase(current);
current = next;

return *current;

int main(int argc, char* argv[])

int nLeave = fun(10, 3);
printf("如果n = 10,数到3的人退出,最后剩下的是%d\n", nLeave );
return 0;

帮你打了半天,给分哦~本回答被提问者采纳

以上是关于c语言,有n个人围成一个圈,顺序排号,从第一个开始报数(1到3),凡报到3的退出圈子问最后留下的人的主要内容,如果未能解决你的问题,请参考以下文章

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

4.c语言编有n个人围成一圈,顺序排号。从第一个人开始报数(从1到m报数),凡报到m的人退出(m>n)(

C语言 n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,计算最后留下的是最初第几号人

C语言 n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,计算最后留下的是最初第几号人

C语言试题142之有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出 圈子,问最后留下的是原来第几号的那位。

JAVA围圈报数 问题