法一:
/*有n个人围成一圈,按顺序从1到n编好号
。从第一个人开始报数,报到m的人退出
圈子,下一个人从1开始报数,报到m的人
退出圈子。如此下去,直到剩下最后一个人。
按退出顺序输出退出圈子的人的编号*/
#include <stdio.h>
#include <stdlib.h>
void item(int p[],int n,int m)
{
int counter,location,total;
location=0;
for(total=1;total<=n;total++){
counter=0;
while(counter<m){
if(p[location]==0)
counter++;
if(counter==m){
p[location]=1;
printf("%-4d",location+1);
}
location=(location+1)%n;
}
}
}
int main()
{
int n,m,i;
int *p;
printf("Give n and m:");
scanf("%d%d",&n,&m);
p=(int *)malloc(n*sizeof(int));
for(i=0;i<=n-1;i++)
p[i]=0;
item(p,n,m);
free(p);
return 0;
}
法二:
/*有n个人围成一圈,按顺序从1到n编好号
。从第一个人开始报数,报到m的人退出
圈子,下一个人从1开始报数,报到m的人
退出圈子。如此下去,直到剩下最后一个人。
按退出顺序输出退出圈子的人的编号*/
#include <stdio.h>
#include <stdlib.h>
int main()
{ int n,m,i;
int total=0,location=0,counter=0;
int *p;
printf("Give n and m:");
scanf("%d%d",&n,&m);
p=(int *)malloc(n*sizeof(int));
for(i=0;i<=n-1;i++)
p[i]=0;
while(total<=n){
if(location>=n)
location=0;
if(p[location]==0){
counter++;
}
if(counter==m){
p[location]=1;
total++;
counter=0;
printf("%-4d",location+1);
}
location++;
}
free(p);
return 0;
}