约瑟夫问题!为啥我的不对捏?求指教!
发布网友
发布时间:2024-10-22 15:56
我来回答
共2个回答
热心网友
时间:2024-10-23 04:41
你的代码没有思路且不清晰的话,别人看起来很难,我下面写个代码:数组是一个圆圈,每次数到m时候把这人拿出来,然后比它大的编号往前移,希望你能看明白
#include<iostream>
using namespace std;
int main(){
int m,n;
cout<<"请输入总人数和报到出局数:"<<endl;
cin>>n>>m;
int *a=new int[n];
for(int i=0;i<n;i++) a[i]=i+1;
int j=1;
int k=0; //最开始从第一个人开始数,第一个人数组下标为0
int l=n; //圈子里还剩下的人,开始是n个
while(l>1){
k = (k+m-1)%l; //数到这人该出局
cout<<a[k]<<endl; //输出出局的人
j = k;
while(j<l-1){
a[j]=a[j+1]; //把出局的人后面的所有人位置往前移
j++;
}
l--; //总人数少了,圈子小了1人
}
cout<<"最后出局的人:"<<a[0]<<endl; //最后剩下的一个人
delete[]a;
return 0;
}
热心网友
时间:2024-10-23 04:41
while(l<1){
这一行错了,应该是l>1吧?当剩余人数大于1的时候,继续循环。
楼上给的算法并不合适,数组的删除操作开销很大,轻易不可使用。
楼主的算法思路很清晰,只是变量的命名不太好。不信我给注释一下。
#include<iostream>
using namespace std;
int main(){
int m,n;
cout<<"请输入总人数和报到出局数:"<<endl;
cin>>n>>m;
while{
int a=new int[n];
for(int i=0;i<n;i++) a[i]=i+1;
int j=1;
int k=0;
int l=n;
//必要时一个空行也会很直观
while(l>1){ //剩余人数大于1时继续踢人
if(a[k]){ //此位置还有人?
if(j++==m){ //此人报数刚好为m?
j=1; //报数重新开始
a[k]=0; //踢了此人
l--;} //人数少了一个
}
if(++k==n)k=0; //到队尾了,重头再来
}
while(a[--i]==0); //从队尾往前找,找那个独苗
cout<<a[i]<<endl; //找到了就显示出来
delete[a]; //行了,孩儿们都可以滚了
}
return0;
}