太上老君文武火:C语言编程问题 请高手相助

来源:百度文库 编辑:高校问答 时间:2024/04/29 08:03:52
求下面问题的源程序:
N(N<100)个人围成一圈,按顺序排号并报数。报数前产生一随机数M,最开始从第一个人开始,从1到M报数,凡报到M的人退出圈子。然后开始下一轮报数,设K为当前圈内剩余人数,每一轮报数前均重新产生随机数M(K<M<K+30)从退出圈子的下一个人开始报数,问最后留下的是最初的第几号。
请高手相助,谢谢啦!

#include <stdio.h>
#include <stdlib.h>
main()
{
int *a,*p_a,i,j=0,k,sum=0,n,m;
printf("请输入排队的人数跟以及报数为退出的号码\n");
scanf("%d%d",&n,&m);
a=(int *)malloc(n*sizeof(int));
p_a=a;
for(i=0;i<n;i++)
a[i]=1;
for(i=0;;i++)
{
if (i==n)
{
i=0;
sum=0;
for(k=0;k<n;k++)
sum+=a[k];
}
if(sum==1)break;
if(a[i]==1)
{
j++;
if(j%m==0)
a[i]=0;
}
}
for(i=0;i<n;i++)
if(a[i]==1)
printf("最后剩下的是第%d号\n",i+1);
}
谢谢楼上的指点

#define N 50 /*参加人数 */
#define M 5 /*报数大小*/
main()
{
int a[N],i,j=0,k,sum=0;
for(i=0;i<N;i++)
a[i]=1;
for(i=0;;i++)
{
if (i==N)
{
i=0;
sum=0;
for(k=0;k<N;k++)
sum+=a[k];
}
if(sum==1)break;

if(a[i]==1)
{
j+=1;
if(j%M==0)
a[i]=0;
}

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