问题:
N个人围成一圈,从第一个人开始报数,数到M的人出圈;再从下个人开始报数,数到M的人出圈;......最后剩下的那人原来的编号是?
解决:
1、 用数组保存原来N个人的编号
2、用循环来解决这个问题,定义一个变量来报数,若报数为M则使这个人的编号为0,报数变量归为0;
3、若这个人的编号不为0,报数加一
4、定义个变量来表示出圈的人数,若报数为M则出圈人数加一,当出圈人数为M-1时,则可以停止循环
5、重新遍历数组,若编号不为0,则输出这个编号
#include <stdio.h>
void Inite(int arr[500],int n)
{
for (int i = 1; i <= n; i++)
{
arr[i] = i;
}
}
int main()
{
int n = 0, m = 0;//n为人数,m为报到出圈的数
printf("请输入n m:");
scanf("%d %d", &n, &m);
int arr[500];
Inite(arr,n);//初始化编号
int i = 1;//数组下标
int count = 0;//出圈人数
int count_m = 0;//报数
while (1)
{
if (arr[i] != 0)
{
count_m++;
}
if (count_m == m)
{
arr[i] = 0;
count++;//出圈人数加一
count_m = 0;//重新报数
}
i++;
if (i > n)
{
i = 1;//超出范围重新第一个人开始
}
if (count == n - 1)//只剩一个人跳出循环
{
break;
}
}
for (int i = 1; i <= n; i++)
{
if (arr[i])//若不为0
{
printf("最后一人的编号为%d",arr[i]);
}
}
return 0;
}