有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
输入描述:
每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。
输出描述:
一行输出最后一个被删掉的数的原始下标位置。
输入例子:
8
输出例子:
6
C++
#include <iostream> #include <vector> using namespace std; int main() { int n; while (cin >> n) { if (n > 1000) n = 1000; vector<int> v(n); for (int i = 0; i<n; i++) v[i] = i; vector<int>::iterator itor; itor = v.begin(); while (true) { if ((itor + 1) == v.end()) itor = v.begin(); else itor++; if ((itor + 1) == v.end()) itor = v.begin(); else itor++; if ((itor + 1) == v.end()) { if (v.size() == 1) { cout << *itor << endl; break; } v.pop_back(); itor = v.begin(); } else itor = v.erase(itor); } } return 0; } /* 解题思路: 隔两个数删,其实是相当于自加了3次, 但是erase()方法会向后移动一位,所以只需要加2次。 这里判断是否到向量尾部元素的方法是((itor + 1) == v.end()), 如果是尾部元素则,不进行自加,直接赋值为v.begin() */