思路:
用两倍大的整型数组存从1到n,那么会扔掉n-1个数,即遍历n-1次;
多设一个变量j,从0开始,每次修改值的时候加2,接下来是处理:
先把第j个元素丢出去,然后值改为-1,再把第j+1个元素的值放到最后,
· 此时的最后是第 j+n-i 的的位置,再改为-1。
注意:
如果输入1,那么扔出的是空,留下的是1。
1 #include<iostream>
2 #include<algorithm>
3 #include<vector>
4 using namespace std;
5 int main()
6 {
7 int n;
8 int a[105];
9 //vector<int> vtr;
10 while (scanf("%d", &n) && n != 0)
11 {
12 for (int i = 1; i <= n; i++)
13 a[i - 1] = i;
14 int remain=1;
15 printf("Discarded cards:");
16 for (int i = 0,j=0; i < n - 1; i++,j=j+2)
17 {
18 if (a[j] != -1)
19 {
20 printf(" %d", a[j]);
21 a[j] = -1;
22 int ex = a[j + 1];
23 a[j + 1] = -1;
24 a[j+n-i] = ex;
25 if (i == n - 2)
26 remain = a[j + n - i];
27 else
28 printf(",");
29 }
30
31 }
32 printf("\n");
33 printf("Remaining card: %d\n",remain );
34 }
35 return 0;
36 }