我正在尝试自学C ++,而且我在我工作的书中遇到了这个项目项目:
在古老的土地上,美丽的公主夏娃有许多追求者。她决定采用以下程序来确定她会嫁给哪个追求者。首先,所有的追求者将一个接一个地排队并分配号码。
第一个追求者是数字1,第二个数字是2,依此类推到最后一个追求者,数字n。从第一个追求者开始,她将计算三个追求者(由于她名字中的三个字母),第三个追求者将从赢得她的手并从线上移除。然后夏娃将继续,再计三个追求者,并消除每三个追求者。当她到达终点时,她会从头开始计算。
例如,如果有六个追求者,那么淘汰过程将如下进行:
123456最初的追求者名单,从1开始计算
12456求婚3被淘汰,继续从4开始算。 1245求婚者6被淘汰,继续从1开始计算125求婚4被淘汰,继续从5开始计算
15名求婚者2被淘汰,继续从5开始算。
1个求婚5被淘汰,1个是幸运获胜者
编写一个程序,使用向量来确定如果有n个追求者,你应该站在哪个位置来嫁给公主。您会发现Vector类中的以下函数很有用:
v.erase(ITER);
//删除iter位置的元素
例如,要使用此函数从名为theVector的矢量变量的开头擦除第四个元素,请使用
theVector.erase(theVector.begin()+ 3);
使用数字3是因为向量中的第一个元素位于索引位置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 :(得分:2)
首先,你的程序中有两个错误:你最初将[0, n]
放在向量中,应该是[1, n]
,并且在打印向量的内容时,你使用{ {1}}它应该是<=
。
现在提出实际问题。我们想要使用大小为2的步骤(当前人右边的第二个人)迭代向量:
<
然而,当我们到达阵列的末尾时,我们想要从前面继续计数。为此,我们可以使用模运算符for (int i = 0; i < vec.size(); i += 2)
:
%
这会将for (int i = 0; i < vec.size(); i = (i + 2) % vec.size())
限制在i
范围内。因此,我们的循环条件现在没用了。相反,当向量的大小为1时,我们需要注意终止循环:
[0, vec.size() - 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);
答案 1 :(得分:0)
使用相对定位并利用vec.erase()的返回值。
newpos = vec.erase(pos);
这里'newpos'指向被删除元素之后的元素。意思是,{1,2,3,4,5,6}中的'3'听话会让你指向'4'。然后你可以做
pos = vec.begin();
while (pos != vec.end()) {
erasePos = // compute erasing position relative to 'pos'
// e.g. pos + 2, within bounds
pos = vec.erase(erasePos);
}
您需要循环执行此操作。
答案 2 :(得分:0)
对于那个只是迭代到结尾并循环回到开头的用例,我会使用elixir(function(mix) { mix.less('app.less')
.copy('underscore/underscore.js', 'public/js/vendor/underscore.js'); });
而不是[14:12:58] Using gulpfile ~/Public/balloonprinting_l5/gulpfile.js
[14:12:58] Starting 'default'...
[14:12:58] Starting 'less'...
[14:12:58] Running Less: resources/assets/less/app.less
[14:12:59] Finished 'default' after 506 ms
[14:13:00] gulp-notify: [Laravel Elixir] Less Compiled!
[14:13:00] Finished 'less' after 1.74 s
[14:13:00] Starting 'copy'...
[14:13:00] Finished 'copy' after 2.86 ms
。该计划可能是:
list