有一个数组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]进行计算。输出描述:
一行输出最后一个被删掉的数的原始下标位置。输入例子1:
8输出例子1:
6
思路
这道题其实就是一道约瑟夫环问题,
可以直接用反推法求解;
已经知道最后一个数字的下标为0,
反推两个数的时候,该数字的下标;
......
以此类推,反推出n个数时的下标
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
n= n> 1000? 999: n;
int result= 0;
for(int i= 2; i<= n; ++i){
result= (result+ 3)% i;
}
cout<<result<<endl;
}
return 0;
}