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

详细写明结题思路,越详细越好!要有程序!... 详细写明结题思路,越详细越好!要有程序! 展开
 我来答
问明6E
高粉答主

2019-05-25 · 每个回答都超有意思的
知道答主
回答量:279
采纳率:100%
帮助的人:13万
展开全部

#include<stdio.h>

#define N 5//人数

void main()

{

int a[N]={0},i=0,out_n=0,call_n=0,*p;

p=a;

while(1){//循环报数

if(*p==0){//如果健在

if(out_n==(N-1))break;//如果仅剩一人

call_n++;//报数

call_n%=3;//最大为3,到了3就从0开始

if(call_n==0){*p=1;out_n++;}//为0(即3)出局

}

p++;if(p==a+N)p=a;//循环转向下一人

}

printf("最后剩余者的编号是:%d\n",p+1-a);

}

扩展资料:

printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。

函数的原型为:int printf(const char*format,...);函数返回值为整型。若成功则返回输出的字符数,输出出错则返回负值。

printf()函数的调用格式为:

printf("<格式化字符串>",<参量表>);

其中格式化字符串包括两部分内容:一部分是正常字符;这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。

参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。

规定符

%d十进制有符号整数

%u十进制无符号整数

%f浮点数

%s字符串

%c单个字符

%p指针的值

%e指数形式的浮点数

%x,%X无符号以十六进制表示的整数

%o无符号以八进制表示的整数

%g把输出的值按照%e或者%f类型中输出长度较小的方式输出

%p输出地址符

%lu 32位无符号整数

%llu 64位无符号整数

淡染by
推荐于2017-12-31 · TA获得超过382个赞
知道答主
回答量:50
采纳率:0%
帮助的人:38.5万
展开全部
#include <stdio.h>
#define n 100
void main()
{int a[n],i,quit_num,k;
for(i=0;i<n;i++)/*数组a存放原始编号*/
a[i]=i+1;
quit_num=0;/*出圈人数*/
i=0;
k=0;
while(quit_num<n-1)/*直到只剩下1人时*/
{if(a[i]!=0)k++;
if(k==3)
{a[i]=0;
quit_num++;
k=0;
}
i++;
if(i==n)i=0;
}
for(i=0;i<n;i++)
if(a[i]!=0)printf("%d",a[i]);
}

能看懂吗?
  再送点详解给你

  #include <stdio.h>

  #define N 50 // 排队人数(可任意更改)
  #define CAL 3 //凡报3的人出列(可任意更改)

  //下面是排队编号函数:从h 开始的n个人依次编号1到n
  void stdline(int *h,int n)
  {
  int i;
  for(i=1;i<n+1;i++) *(h+i-1)=i;
  }

  /*下面函数表示从指针h处开始的人数为boy个人排队,从1报数,每报到call的人出列*/
  void outline(int *h,int boy,int call)
  {
  int *p, chu, callnum;
  /*说明:
  p 工作指针,表示从头依次指向每个元素,点名
  chu 计数器,记录出列的人数
  callnum 计数器,记录点名次序
  */
  chu=0;
  callnum=0;//各计数器清零
  p=h; //开始时,工作指针指向数组首

  printf("出列顺序是:\n");
  while(chu<boy)
  {
  if(*p!=0) callnum++; //每次加报数
  if(callnum==call) //如果某一个人报到出列数call...
  {
  printf("%5d",*p); //打印编号,表示出列
  chu++; //出列人数加1
  if(chu==boy)//如果全部出列....
  {
  *h=*p; //把最后一个出列人的编号记入地址开始处
  return; //结束
  }

  if(chu%10==0)printf("\n");//每输出10个换行
  callnum=0; //出列后,重新报数
  *p=0; //出列后,将其编号赋零,以示区别
  }
  p++; //工作指针移向下一个人,即下一个数组元素
  if(p>h+boy-1)p=h;/*如果移到最后一个元素的后面,则让指向地址开头继续报数*/
  }

  }

  void main()
  {
  int a[N]; //用数组模拟队列,每个元素代表一个人
  stdline(a,N);//编号
  outline(a,N,CAL);//计算并打印出列顺序
  printf("\n最后留下来的是 %d 号\n",*a);/*在函数中,已经把最后一个人的编号写入了数组首地址处,

  这里输出就可以了*/
  }
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liuchengbodp
2013-06-01 · TA获得超过102个赞
知道小有建树答主
回答量:173
采纳率:75%
帮助的人:68.5万
展开全部
void num(int n,int list) //n是人数,list是报的总数
{
printf("退出圈子的号数是%d\n",(list%n)==0?n:(list%n)); //排成一圈,多的重头算. 取 list以内的数.list%n , 结果等于零说明list==n,否则返回余数
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蛋疼货time
2013-06-03
知道答主
回答量:16
采纳率:0%
帮助的人:10.9万
展开全部
C语言做起来比较惨

c++比较好做,用标准库的queue就可以很容易实现。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
就点到为止
2013-06-01 · 超过19用户采纳过TA的回答
知道答主
回答量:84
采纳率:100%
帮助的人:52.6万
展开全部
约瑟夫问题,这个我知道,等晚上有时间帮你写个代码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式