约瑟夫
  • 板块灌水区
  • 楼主a6b6c6d6
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/10 11:58
  • 上次更新2024/11/10 15:49:48
查看原帖
约瑟夫
1354472
a6b6c6d6楼主2024/11/10 11:58

【题目描述】

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从 1 开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

【输入格式】

每行是用空格分开的两个整数,第一个是 n, 第二个是 m (0 < m,n <=300)。最后一行是:

0 0

【输出格式】

对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

样例输入

6 2 12 4 8 3 0 0 样例输出

5 1 7

#include<bits/stdc++.h>
using namespace std;
int a,b;
int x[301];
int solve(int a,int b){
	memset(x,1,sizeof(x));
	int t=a;
	int i=0;
	while(t>1){
		i++; 
		int p;
		if(i%a==0)p=a;
		else p=i%a;
		while(x[p]==0){
			i++;
			if(i%a==0)p=a;
			else p=i%a;
		}
		if(i%b==0){
			x[p]=0;
			t--;
		}
		i++;
	}
	for(int j=1;j<=a;j++){
		if(x[j]==1){
			cout<<j<<endl;
			break;
		}
	}
}
int main(){
	while(1){
		cin>>a>>b;
		if(a==0&&b==0)break;
		else{
			solve(a,b);
		}
	}
	return 0;
}

死循环了!!

2024/11/10 11:58
加载中...