我试图自学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;
}