问题描述:n个小朋友做游戏,编号从1到n。他们按编号大小从小到大依次顺时针围成一个圈,第一个小朋友开始报1,顺时针方向报数加1,报m的人会离开,下一个小朋友继续报1,直到只剩一个小朋友。
输入:两个正整数
输出:最后一个小朋友编号
样例输入:10 5
样例输出:3
该题使用数组解决问题,妙处在于将数组中需要用到的数字全部设置为一,通过一的变换来记录人数的变化
#include<stdio.h>
int main()
{
int a[100] = { 0 };
int cnt = 0;//此处记录报到的数
int n, m;
scanf("%d%d", &n, &m);
int num = m;//此处表示小朋友的总数
for (int i = 1;i <= m;i++)
{
a[i] = 1;//此处将数组中需要用到的数设置为1
}
for (int i = 1;;i++)
{
if (i == m + 1)
i = 1;//小朋友们围成的是一个圈故设置这样一个循环
if (a[i] == 1)
{
cnt++;
}
else
continue;//若检测到的数为0时直接略过
if (cnt == n)//当报的数到达规定数时,将该位置的小朋友逐出圆圈
{
a[i] = 0;
cnt = 0;//此处设定为重新开始计数
num--;//此处表示逐出一个小朋友
}
if (num == 1)
break;
}
for (int i = 1;i <= 10;i++)//当只剩下一个小朋友时那个小朋友的在数组里的数一定是一
{
if (a[i] == 1)
{
printf("%d", i);//打印最后的小朋友的代数
}
}
return 0;
}