c语言编程 100人围圈问题

这个是系统给出的参考答案,可以正常运行,但是中间有一句无论如何都难以理解,希望高手帮助!感激不尽。“s1=(s1+m-1)%i;//求得每次出圈人的位置”这一句为什么可以... 这个是系统给出的参考答案,可以正常运行,但是中间有一句无论如何都难以理解,希望高手帮助!感激不尽。

“s1 = (s1+m-1)%i; //求得每次出圈人的位置” 这一句为什么可以求出“出圈人的位置”,我想的是第 10,20,30...的人会出圈,但是用这个语句算的是10,19,28,37...这一句到底该怎样理解?
下图是本题的题目

int i, j, s1, w;
s1 = s;
/*将1到n个人的序号存入一维数组p中*/
for (i=1; i<=n; i++) //循环变量i从1开始,依次递增到n
p[i-1] = i; //把i的值赋给数组元素p[i-1]
for (i=n; i>=2; i--)
{
s1 = (s1+m-1)%i; //求得每次出圈人的位置
if (s1 == 0) //如果s1等于0,则说明要开始报数的人是最后一个人
s1 = i; //把此时变量i的值赋给s1
w = p[s1-1]; //把每次出圈的人的序号赋给w
/*将第s1个至倒数第i个元素依次向前移动一个位置*/
for (j=s1; j<=i-1; j++)
p[j-1] = p[j];
p[i-1] = w; //把每次出圈的人的序号赋给倒数第i个位置上
}
展开
 我来答
御含灵9r
2013-03-23 · TA获得超过4157个赞
知道大有可为答主
回答量:3007
采纳率:0%
帮助的人:2666万
展开全部
程序执行的时候数组元素的下标变化了
本来要去掉10 20 30的人
当第一个人10号被去掉10号后面的元素都前移了一个位置
原来的20号变成了19号,30--》29。
第二个人19号被去掉,原来的30号人已经移了两个位置变成30-》29--》28号
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式