1. 程式人生 > >【華為】刪數

【華為】刪數

題目描述

有一個數組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

輸出

複製

6
#include "stdio.h"
#include <math.h>
#include <vector>
#include <iostream>
using namespace std;

int main()
{
	int n;
	while (cin >> n)
	{
		vector<bool> visit(n, 0);
		int pos=0,step = 0;
		int sum = n;
		int ans = -1;
		while (sum > 0)
		{
			if (!visit[pos%n])
				step++;

			if (step % 3 == 0&&!visit[pos%n]) //kill
			{
				sum--;
				visit[pos%n] = 1;
			}

			if (sum == 0)
				ans = (pos % n);
			pos++;
			
		}
		cout << ans << endl;
	}
	
	return 0;
}