(一)问题要求
题目描述:
n个小朋友做游戏,编号从1到n。他们按编号大小从小到大依次顺时针围成一个圈,第一个小朋友开始报1,顺时针方向报数加1,报m的人会离开,下一个小朋友继续报1,直到只剩一个小朋友。
输入:
两个正整数n,m(均不超过1000)。
输出:
最后一个小朋友编号。
(二)解题思路
通过观察这个题,可以发现这个题包含两个量。
一个是小朋友们的编号,这个是自始至终不变的量,而且最后也要求输出最终剩下小朋友的编号;另一个是他们报数的数值,在有人出局重新报数时,是变化的量。
于是我想到了一个方法:
①声明一个数组a[i],用数组a[i]来储存每个小朋友的编号。
②然后在一个循环之中,先定义一个变量k=0,k按照题目要求开始递增,等到等于m时就把k重置为零,并把这时的a[i]赋值为零。
③最后只剩下一个a[i]的数值不等于零,把这个a[i]的数值输出,这个数值就是最后剩下的小朋友的编号。
#include<stdio.h>
int main()
{
int n;
int m;
int i;
int k = 0;
int l = 0;//n为总数,m为固定数字,l为离队的小朋友数目
scanf("%d %d", &n, &m);
int c[n];
for(i=0; i<n; i++)
c[i] = i+1; //把每个小朋友的编号存入数组中
while(l < n-1)
{
for(i=0; i<n; i++)
{
if(c[i])
{ //若这个数组没有被赋值为零就可以接着运算
k++;
if(k == m)
{
c[i] = 0;//小朋友离队,把他的数组赋值为零
k = 0; //k重置为零
l++; //离队小朋友数+1
if(l == n-1)
{ //当离队小朋友达到n-1人时
for(i=0; i<=n; i++)
{
if(c[i])
{
printf("%d", c[i]);//输出剩下小朋友的编号
break;
}
}
break;
}
}
}
}
}
return 0;
}