P122.32

来源:互联网 发布:长春java培训哪家好 编辑:程序博客网 时间:2024/05/16 14:36
#include<stdio.h>
#define N 100
void order(int man[],int n,int m);
int find(int a[],int n,int key);
main(){
int i,k,m,n,flag=1,man[N]={0};
while(flag=1){
printf("\n输入总人数n和报数间隔m:");
    scanf("%d%d",&n,&m);
    order(man,n,m);
    printf("人的顺序为:\n");
    for(i=0;i<n;i++)
printf("%4d%c",i+1,((i+1)%15)==0?'\n':' ');
     printf("\n每个人相应的第几个出队:\n");
for(i=0;i<n;i++)
printf("%4d%c",man[i],((i+1)%15)==0?'\n':' ');
printf("\n输入你想知道最后出队的人数:");
scanf("%d",&k);
for(i=0;i<k;i++)
printf("\n倒数第%d个出队的人为%d号\n",1+i,1+find(man,n,(n-i)));
printf("\n是否重新来过(是请按1,否请按0):");
scanf("%d",&flag);
}
}
void order(int man[],int n,int m){
int i,k,pos;             //i为报数用计数器,k表示出队顺序,pos表示约瑟夫环
for(i=0;i<n+1;i++)
man[i]=0;
i=k=0;
for(pos=0;k<n;pos=(pos+1)%n){      //循环变量pos对一个圆环循环遍历
if(man[pos]==0)
i++;
if(i==m){
i=0;
k++;                       //出队数加1
man[pos]=k;                //man[pos]是第k个出队的人
}
}
}
int find(int a[],int n,int key){
int i;
for(i=0;i<n;i++)
if(key==a[i])
return i;

}



0 0
原创粉丝点击