经典的约瑟夫斯问题(n 个人围成一个圆圈,从第 p 个人开始,然后删除每个第 k 个人,找到最后剩下的人的索引)但在这个版本中,每个人还被分配了一个整数(从键盘读取)旁边他们的位置在圈子里。我必须输出分配给最后一个活着的人的整数。
我已经完成了基本算法,但它似乎给了我奇怪的输出,比如当我只输入 2 位数字时,5 位数字。
n=一开始圈子里的人数
p=我们开始计数的人的索引
k=第k个人被移除
我试图通过创建一个向量 v[i] 来解决它,该向量保存分配给每个人的整数。
当 (n>1) 时,对于 i=p,我将 v[i] 之后的所有内容向左移动 1 个空格并减少 n,然后将 k 添加到 i。如果我们通过 n,那么 i 变为 i+kn。
int main()
{ int n,v[100],i,p,k,j;
cout<<"n=";
cin>>n;
cout<<"p=";
cin>>p;
cout<<"k=";
cin>>k;
cout<<endl;
for (i=1; i<=n; i++)
cin>>v[i];
for (i=p; i<=n-k; i=i+k)
{ while (n!=1)
{for(j=p+1; j<=n; j++)
{
v[j-1]=v[j];
}
n--;
if ((i+k)>n)
{
i=i+k-n;
}
}}
for (i=1; i<=n; i++)
cout<<v[i]<<" ";
return 0;
}