我试图自学C++,并且在我的著作中遇到了这个程序项目:

在一个古老的土地上,美丽的夏娃公主有很多追求者。她决定按照以下程序确定要与哪个求婚者结婚。首先,所有求婚者将一个接一个排成一行并分配编号。

第一个求婚者是数字1,第二个求婚者是数字2,依此类推,直到最后一个求婚者数字n。从第一个求婚者开始,她将依次计算三个求婚者(因为她的名字中的三个字母),而第三个求婚者将赢得她的牌而被淘汰并从行中移出。夏娃随后将继续,计数另外三个求婚者,并消除每三个求婚者。当她到达行尾时,她将从头开始继续计数。

例如,如果有六个追求者,则消除过程将如下进行:

123456最初的求婚者 list ,从1开始计数

12456追求者3被淘汰,继续从4计数

1245个求婚者6被淘汰,从1开始继续计数

125个追求者4被淘汰,从5个继续计算

15名追求者2被淘汰,从5名继续

1个追求者5个被淘汰,1个是幸运的获胜者

编写一个使用 vector 的程序,以确定如果有n个求婚者,您应该站在哪个位置嫁给公主。您将从Vector类中发现以下功能有用:

v.erase(iter);

//删除位置iter的元素

例如,要使用此函数从名为theVector的 vector 变量的开头擦除第四个元素,请使用

theVector.erase(theVector.begin()+ 3);

使用数字3是因为 vector 中的第一个元素位于索引位置0。

我已经编写了一些初步的代码,但是在从第一个求婚者(即第三个求婚者)被淘汰以开始从第四个求婚者开始算起之后,我很难弄清楚如何告诉程序。也许嵌套循环会起作用?我已经找到了使用类的在线解决方案,但是我很难理解,并且我觉得有一个简单的方法可以解决此问题,我们将不胜感激。

#include <iostream>
#include <vector>

using namespace std;

int main ()
{
 int n;
 vector<int> vec;
 cout << "Enter the number of suitors: " << endl;
 cin >> n;

 // set some values (from 1 to n)
 for(int i = 0; i <= n; i++){
  vec.push_back(i);
 }
 // erase third suitor
  vec.erase(vec.begin()+2);

 // print vector with erased suitor
  for(unsigned i = 0; i <= vec.size(); i++){
   cout << vec[i] << endl;
   }


 }

最佳答案

首先,程序中存在两个错误:首先将[0, n]放入 vector 中,应该为[1, n];在打印 vector 的内容时,请使用<=,而应将其为<

现在是实际问题。我们要迭代步长为2的 vector (当前人右边的第二个人):

for (int i = 0; i < vec.size(); i += 2)

但是,当我们到达数组的末尾时,我们要从头继续计数。为此,我们可以使用模运算符%:
for (int i = 0; i < vec.size(); i = (i + 2) % vec.size())

这会将i限制在[0, vec.size() - 1]范围内。因此,我们的循环条件现在没有用了。相反,当 vector 的大小为1时,我们需要注意终止循环:
for (int i = 0; vec.size() > 1; i = (i + 2) % vec.size())

放在一起,我们得到以下内容:
for (int i = 0; vec.size() > 1; i = (i + 2) % vec.size())
    vec.erase(vec.begin() + i + 2);

或等效地:
for (int i = 2; vec.size() > 1; i = (i + 2) % vec.size())
    vec.erase(vec.begin() + i);

当此循环终止时, vector 中唯一的元素是幸运求婚者的编号。

编辑:要在每次消除后打印出 vector 的内容,请尝试以下操作:
for (int i = 2; vec.size() > 1; i = (i + 2) % vec.size())
{
    vec.erase(vec.begin() + i);

    for (int j = 0; j < vec.size(); j++)
        cout << vec[j];
    cout << endl;
}

10-01 11:52