C语言:有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数。

【问题描述】有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留... 【问题描述】有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。

【输入形式】输入人数n
【输出形式】输出依次退出的人的编号,和最后留下的人的编号
【样例输入输出】
input n:5
3 1 5 2
last no. is:4
【样例说明】5个人,3号 1号 5号 2号依次退出,最后留下4号
.
展开
 我来答
iiiiiiiipl
2019-06-02 · TA获得超过9921个赞
知道答主
回答量:68
采纳率:66%
帮助的人:3.7万
展开全部

#include<stdio.h>

int main()

{

int i,n,N,out,a[1000];

out=i=n=0;

printf("输入约瑟夫圈大小\n100\n");

scanf("%d",&N);

for(i=0;i<N;i++)         

{

a[i]=1;

}

i=0;

while(out!=N-1)         

{

if(a[i]==1)n++;

if(n==3){a[i]=0;n=0;out++;}

i++;

if(i==N)i=0;

}

for(i=0;i<N;i++)

if(a[i]==1)printf("最后剩下的是第%d个人",i+1);break;

return 0;

}

扩展资料:

需要说明的是:

1、一个C语言源程序可以由一个或多个源文件组成。

2、每个源文件可由一个或多个函数组成。

3、一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。是整个程序的入口。

4、源程序中可以有预处理命令(包括include 命令,ifdef、ifndef命令、define命令),预处理命令通常应放在源文件或源程序的最前面。

5、每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。结构体、联合体、枚举型的声明的“}”后要加“ ;”。

6、标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。

参考资料:

百度百科-c语言

物理公司的
2017-05-28 · TA获得超过5695个赞
知道大有可为答主
回答量:6105
采纳率:86%
帮助的人:1345万
展开全部
#include<stdio.h>
#include<stdlib.h>
int main()
  { 
  int i=0,j=0;
  int a[10000]={0};
  int n;
  printf("Input n(n must be a natural number less than 10000):");
  scanf("%d",&n);
  if(n>10000||n<=0)
    {
   printf("%d is out of range of valid values.\n",n);
   exit(1);
    }
  for(j=0;j<n;j++)
  a[j]=1;
  int k=0;
  int sum=0;
  do
    {
    k=k+a[i%n];
    if(k==3)
      {
      a[i%n]=0;
      k=0;
      sum=0;
      }
    i++;
    for(j=0;j<n;j++)
      sum=sum+a[j];
    }while(sum!=0);
   printf("Last No. is:%d\n",(i-1)%n+1);
    return 0;
  }
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wen8756jie
2017-05-29 · TA获得超过174个赞
知道小有建树答主
回答量:194
采纳率:60%
帮助的人:56万
展开全部
#include
#define N 9999
int main()
{
int n,a[N],*p,i=0,out=0,count=0;
printf("Input n(n must be a natural number less than 10000):");
scanf("%d",&n);
if(n>=10000)
printf("n is out of range of valid values.");改为printf("%d is out of range of valid values.",n);
else
{
for(i=0;i<=n;i++) 改为a[i]=i;
a[i+1]=i; //这样做a[0]是个不确定的值,执行完p=a;后*p
p=a; 的值也是不确定的,后面的if判断条件不确定了
while(out!=n){ 这儿应该是out!=n-1吧
if(*p!=0) 这段可以改成这样for(;;){ if(*p!=0){
count++; count++;p++;}结束if
if(count==3){ if(count==3){ out++; out++;
*p=0; *p=0; break;}结束if
} }结束for
count=0; //此处导致count永远只能是0或1所以out的值不会变
把这儿的p++删了 p++; while就成死循环了
if(*p==a[n-1]) 把这个if语句嵌套到if(*p!=0)里的p++后面这儿不要了
p=a;
}
printf("%d",*p);
}
return 0;
}
这样改完后应该能把最后剩下的号码打出,其实可以把出局的顺序也打出来楼主想想啊,挺简单的,而且好像有很短的代码解决这个问题,多思考啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式