问题描述:
有n个人围成一圈,顺序排号(从1排到n)。 从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子, 问最后留下的是原来第几号的那位?
先上答案
# include <stdio.h>
int main(void)
{
int n, m, i, j ,count;
scanf("%d %d", &n, &m);
int arr[n];
for(i=0; i<n; i++)
arr[i] = i+1;
i = 1;
j = 0;
count = 0;
while(count != n-1)
{
if (arr[j] != 0)
{
if(i == m)
{
count++;
arr[j] = 0;
}
i++;
}
j++;
if (i > m)
i = 1;
if(j > n-1)
j = 0;
}
for(j=0; j<n; j++)
if(arr[j] != 0)
{
printf("The answer is %d", arr[j]);
break;
}
return 0;
}
解题思路:
- 用长度为n的数组arr表示这n个人, 数组中每个元素的值为编号,即arr[i] = i+1;
- 总体思路是不断的遍历数组, 将满足条件的元素赋值为0, 代表移除此元素, 同时count用来记录被移除的元素的个数, 但count=n-1时, 遍历结束
- i 作为‘有效遍历’的变量, 对应每个人报的数字, 只有在数组对应元素不为0的时候才会自增, i自增至m+1时退回1
- j用于对所有元素重复遍历
- 剔除了n-1个元素后, 数组剩下的唯一一个不为0的元素就是答案了