0

经典的约瑟夫斯问题(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;
}
4

0 回答 0