某部队进行新兵队列训练,将新兵从1开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始1至2报数,凡报到2的出列,剩下的向小序号方向靠拢,再从头开始进行1至3报数,凡报到3的出列,剩下的向小序号方向靠拢,继续从头开始进行1至2报数,以后从头开始轮流进行1至2报数、1至3报数直到剩下的人数不超过三人为止。编写程序,输入数N为最开始的新兵人数(2 < N < 6000),输出剩下的新兵最初的编号。
样例输入:
21
样例输出:
1 7 19
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Compress(int a[], int n) // 或者写成 *a,但写成 a,*a[]是错的
{
for (int i = 0; i < n; i++)
{
if (a[i] == 0)
{
for (int k = i; k <= n - 1; k++)
{
a[k] = a[k + 1];
}
n = n - 1;
}
}
return n;
}
int main()
{
int n;
int* a = (int*)malloc(6000 * sizeof(int));
if (a == NULL)
return 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
}
int flag = 0;
while (n > 3)
{
if (flag == 0)
{
for (int i = 0; i < n; i++)
{
if ((i + 1) % 2 == 0) // 不能写成 a[i] % 2 == 0
{
a[i] = 0;
}
}
flag = 1;
}
else
{
for (int i = 0; i < n; i++)
{
if ((i + 1) % 3 == 0)
{
a[i] = 0;
}
}
flag = 0;
}
n = Compress(a, n);
}
n == 3 ? printf("%d %d %d", a[0], a[1], a[2])
: printf("%d %d", a[0], a[1]);
return 0;
}