有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?
分析:可以构造一个数组进行操作,声明一个变量来计数,将报到3的置0, 然后最后将数组中不为0的元素输出即为剩下的;
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int i, n, m, k, num[100];
int *p = NULL;
printf("input the num: ");
scanf("%d", &n);
p = num;
k = 0; //用于计数
m = 0; //统计退出的人数
//给每个人编号
for (i = 0; i < n; i++)
*(p + i) = i + 1;
i = 0;
while (m < n - 1) //未退出的人数大于1时执行循环体
{
if (*(p + i) != 0) //不为0的就可以进行报数
k++;
if (k == 3) //报数为3的置0
{
*(p + i) = 0;
k = 0;
m++;
}
i++;
if (i == n)
i = 0;
}
for (i = 0; i < n; i++) //筛选出不为0的元素
{
if (*(p + i) != 0)
break;
}
printf("left is %d\n", *(p + i));
return 0;
}