古代某法管要判决n个犯人死刑,他有一条荒唐的逻辑,将犯人首位相接排成圆圈,所有计数从1开始;然后从第s个人开始数,每数到m个犯人,则拉出来处决;然后再数m个,数到的犯人再处决;......;但剩下的最后一个犯人可以赦免。编程序,给出处决顺序,并告知哪一个人活下来。
输入:三个整数n(n<=1000),s和m,都可以使用int类型变量表示。
输出:依次输出被处决人员的编号,每个编号之间使用一个西文空格间隔,最后一个编号后无字符。
样例:
输入:6 1 5
输出:5 4 6 2 3 1
//用顺序表存储,虽不比链表存储,但没涉及指针,比较能够看懂
#include <stdio.h>
void jose(int n,int s,int m){
int i,w,a[999],j,u=n,b[999];
for(i=0;i<n;i++){//给犯人编号,用顺序表存储犯人编号
b[i]=i+1;
}w=0;
while(n>0){
if(a[w-1]==0||w==0) a[w]=(s+m-1)%n;//a[w]运算出当前顺序表中第几位被杀
else a[w]=(a[w-1]+m-1)%n;
if(a[w]==0){
if(w==i-1)printf("%d\n",b[n-1]);//用于最后一个编号无字符
else printf("%d ",b[n-1]);u--;//输出被杀犯人编号
}
else {
if(w==i-1)printf("%d\n",b[a[w]-1]);//用于最后一个编号无字符
else printf("%d ",b[a[w]-1]);//输出被杀犯人编号
for(j=a[w]-1;u-j+1>=0;j++){//去除被杀掉的犯人,顺序表往前推
b[j]=b[j+1];
}
u--;
}
n--;w++;
}
}
int main(){
int n,s,m;
scanf("%d%d%d",&n,&s,&m);
jose(n,s,m);
return 0;
}