c语言问题:
void main()
{
int n[100],num=0,i=0,p,q,j,k,m; //数组n存num个数,num为手动输入,i为当前位置
printf("总共有多少人?:\n");
scanf("%d",&num); //输入人数num;
for(q=0;q<num;q++) //随机数产生他们手里的值
n[q]=rand()%num + 1;
printf("号 手里\n");
for(q=0;q<num;q++)
printf("%d %d\n",q+1,n[q]);
printf("\n输入一个m:");//第一个m
scanf("%d",&m);
for(j=0;j<num-1;j++) //踢出的人,全部记为0
{
for(k=0;k<m-1;k++)//让循环跑m-1次找到第三个人(因为最后k还是++一次的)
{
while(n[i]==0)//如果手里是0的话,这个人被T出了,不能算在队列里,所以找到TA时候第一个不是0的(还有效的人)
{
i++;
if(i==num)
i=0;
}
i++;
while(n[i]==0)//算下一位,同样要判断这个人还有没有效
{
i++;
if(i==num)
i=0;
}
if(i==num)//如果是数组最后一位的后一位,那么就是数组第一个。之后也会判断第一个有没有效
i=0;
printf("报数%d,当前m:%d\n",k+1,m);
}
printf("找到了第m个,它手里的值为%d\n",n[i]);
m=n[i];
n[i]=0;
}
for(p=0;p<num;p++) //输出最后不为0,也就是最后剩下的那位
if(n[p]!=0)
printf("还剩下一个人:%d\n",n[p]);
system("PAUSE");
}
泪流满面~希望能帮到楼主您啊!参考了以前我回答的一个程序。
2023-06-12 广告
还有你需要的结果是什么?所有密码序列吗?
既然是任意数,而且人数也不确定,有可能构成死循环
这就是josephus问题的变式。
代码如下:链表实现(其中s为开始报数的人,n为总人数,m同题)
#include<stdio.h>
#include<stdlib.h>
typedef struct lst
{
int data;
struct lst *next;
}LST;
main()
{
LST *p=NULL,*q=NULL,*head=NULL;
int i=0,n=0,m=0,s=0,k=0,j=0;
printf("please input n: ");
fflush(stdin);
scanf("%d",&n); //clearn screen
printf("please input m: ");
fflush(stdin);
scanf("%d",&m);
printf("please input s: ");
fflush(stdin);
scanf("%d",&s);
if(n==0||m==0||s==0)
printf(" 0 ");
else
{
head=(LST *)malloc(sizeof(LST));
head->next=NULL;
k=n;
q=head;
q->data=1;
if(n<=0) exit;
for(i=2;i<=n;i++)
{
p=(LST *)malloc(sizeof(LST));
p->next=NULL;
q->next=p;
p->data=i;
q=p;
}
q->next=head;
p=head;
if(p->data!=s)
p=p->next;
do
{
for(j=1;j<m-1;j++)
p=p->next;
q=p;
p=p->next;
q->next=p->next;
m=p->data;
printf(" %d ",p->data);
free(p);
k--;
p=q->next;
}while(k!=0);
}
getch();
}
运行如下: