Joseph函数
题目:设有n个人围坐一圈,并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每10个人一组,给出这n个人的顺序表,请编制函数Joseph()实现此功能。
#include<stdio.h>
#include<stdlib.h>
int Joseph(int n,int s,int m);
int main(void)
{
int n=0,s=0,m=0;//n为总人数,s为开始报数人的编号,m为报数多少个人后结束
printf("请输入总人数:");
scanf("%d",&n);
printf("请输入开始报数的人的编号:");
scanf("%d",&s);
printf("请输入报数多少个人后结束:");
scanf("%d",&m);
printf("\n这%d个人的出圈顺序为:\n\n",n);
Joseph(n,s,m);//调用Joseph函数进行输出
return 0;
}
int Joseph(int n,int s,int m)
{
int i=0;
int count=0,group=0;//count控制报数的次数,group用来控制换行和结束报数
int *a=NULL;//存储n个人的编号
a=(int *)malloc((n+1)*sizeof(int));//动态分配内存
if(a==NULL)
{
printf("内存申请失败!\n");
exit(-1);
}
a[0]=0;
for(i=1;i<=n;i++)
a[i]=i;
while(1)
{
while(1)
{
if(a[s]!=0)
{
count++;
if(count!=m) s++;
else break;
if(s>n) {s=1;continue;}
else continue;
}
else
{
s++;
if(s>n) {s=1;continue;}
else continue;
}
}
printf("%5d ",a[s]);
a[s]=0;count=0;group++;
if(group==n) {printf("\n\n"); return 0;}
else
{
if(group%10==0) printf("\n");
else s++;
if(s>n) {s=1;continue;}
else continue;
}
}
return 0;
}
浙公网安备 33010602011771号