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

C语言问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
下面是我自己写的程序,出来的答案是错的,求大神指出哪里错误
#include <stdio.h>
void main ()
{
int a[20];
int m,n,k,i=0,x;
int *p;
p=a;
printf("请输入报数人数n:");
scanf("%d",&n);
a[0]=n;
for (i=1;i<n-1;i++)
{
a[i]=i+1;
}
m=0;
while(m<n-1)
{
k=0;
while(k<3)
{
i=i%n;
if(a[i]!=-1)
{
k++;
if(k=3) i--;
}

i++;
}
a[i]=-1;
m++;
i++;
}
x=0;
while(a[x]==-1) {x++;}
printf("The last one is NO.%d\n",*(a+x));
}

供参考……

#include "stdio.h"
int main(int argc,char *argv[]){
int n,ans,i;
scanf("%d",&n);
ans=0; 
if(n==0)
return 0;
for(i=2;i<=n;i++)
ans=(ans+3)%i;
printf("%d\n",ans%n+1);
return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答

...顺序排号。从第一个人开始报数(从1到3报 数),凡报到3的人退出圈子...
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);}

...顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子...
设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。假设除去第k个人,则 0, 1, 2, 3...

...顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出...
n个人围成一圈,按顺序编号,分别为1、2、3..n。(你可以理解成每个人的座号)。然后1号开始,每人依次报号。即 (这里假设n=5)(前面是座号、后面是他报的号)1:1 2:2 3:3(退出)现在只剩下座号为1、2、4、5的人,从3的下一个开始报号 4:1 5:2 1:3(退出)2:1 4:2 5:3...

...顺序排号。从第一个人开始报数(从1到3报 数),凡报到3的人退出圈子...
void main(){ int i = 0;int n = 0;int out = 0; \/\/退出的人数 int num = 0; \/\/报数 int a[1024] = {0}; \/\/0表示退出圈子 printf("Input n:");scanf("%d", &n);for (i = 0; i < n; i++){ a[i] = 1;} i = 0;while (out != n-1){ if (a[i] == ...

...顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈 ...
该题目中:if(*(p+i)!=0) k++;就是实现了,那些没有被淘汰的人(数组的对应元素值不为0)围成一个圈。但是,虽然被淘汰的人不再参与围成一个圈,但是,每次都要逐一判断这n人是否被淘汰,i就是用来记这个数的。所以,每次的圈子,表面上是由没有被淘汰的人围起来的,但是逐一进行了判断...

...有n个人围成一圈,顺序排号,从第一个人开始(从1-
{ char student[N];\/\/N个人,1表示未退出,0表示已经退出 int out[N];\/\/退出的人的号码记录 int count = -1;\/\/循环计数 0,1,2 <=> 1-3 int num_out = -1;\/\/退出号码记录的数组的下标 memset(student, 1, sizeof(student));\/\/将所有人状态置为1(未退出)for (int i = 0;...

有n个人围城一圈,顺序排号。从第一个人开始报数(从1报到3),凡报到3...
for(i=0;i<n;i++) \/\/此处的for循环是给这n个人编号:第一个是1,第二个是2,……而且,仍然保持p指向数组num的起始处 (p+i)=i+1;i=0;k=0;m=0;while(m<n-1) \/\/此处的while循环是挑选报3的人退出圈子 { if(*(p+i)!=0) k++; \/\/初始从i=0开始不空则k加一 if(k...

...顺序排号。从第1个人开始报数(从1到3),凡报到3的人退出圈子,问最后...
int count = 0;for(int i = 0; i < N; ++i, ++num){ if(num == 4){ num = 1;} if(num == 3){ ++count;} a[i] = num;} while(count != N-1){ count = 0;for(i = 0; i < N; ++i){ if(a[i] == 3){ count++;continue;} else { if(num == 4){ num...

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出 圈子,问最后留下的是原来第几号的那位。1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来...

...个圈,顺序排号,从第一个人开始报数(1-3),凡是报数为3的
n=int(input("请输入总人数(从一个报数开始以1编号,逐次递增):"))a=list(range(1,n+1))while len(a)>2: c = len(a) % 3 b = [] if c == 0: for i in range(1, len(a) + 1): if i % 3 != 0: b.append(a[i - 1]) a = b print...

相似回答