uva133----约瑟夫类问题
code:
#include <cstdio>
//经过如果不是空格+1,循环下去,当碰到i==k时,返回值,退出
//一个顺时针,和一个逆时针
int s[25];
int n;
//计算出其经过旋转得到的值,返回
int compute(int p,int d,int k){//顺时针 参数:p:初始值 算的值,d:方向 逆时针+1,顺时针-1,k:跳跃值
while(k--){
//循环
//条件
do{
p = (p+d+n-1)%n+1;
}while(s[p] == 0);
}
return p;
} //返回值 : 找到的值
int main(){
int k,m;
while(scanf("%d %d %d",&n,&k,&m)==3&&n){
int p = n,q = 1;
int len = n;
for(int i = 1;i<= n;i++)
s[i] = i;
while(len){
p = compute(p,1,k);
q = compute(q,-1,m);
printf("%3d",p);
len--;
if(q != p){
printf("%3d",q);
len--;
}
if(len)printf(",");
s[p] = s[q] = 0;
}
printf("\n");
}
return 0;
}
浙公网安备 33010602011771号