猴子选大王,(有注解很清晰),不知道错哪了,求纠正

题目是这样的:
题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。

输入
输入两个整数n和m,1<=m<=n<=100。

输出
输出猴王的编号

样例输入 Copy
8 3
样例输出 Copy
7
来源/分类
问题是测试时有一组数据答案错误:

img


//用的笨方法,若有更好思路,求指点
//这个是测试用的工程文件,于是把常用的头文件都打上了,可能有多余的
#include<stdio.h>
#include<stdlib.h>
#include <limits.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
int main()
{
    int n, m;
    int k, s, i = 1;
    scanf("%d %d", &n, &m);
    if(n == 1)//只有一个猴子,直接称王
        printf("1");
    else
    {
        int r = n;
        int number[101];
        for (int j = 0; j < 101; j++) number[j] = 1;
        while (n > 1)
        {
            s = 0;
            for (i; i < r + 1; )
            {
                if (number[i] == 0)//当前位置的猴子被淘汰了,跳过
                {
                    i %= r;
                    i++;
                    continue;
                }
                else s++;//计数=1
                if (s == m)//当数了m个数时
                {
                    number[i] = 0;//当前位置的猴子淘汰
                    i %= r;
                    i++;
                    n--;//总猴子数量-1
                    break;
                }
                i %= r;
                i++;
            }
            if (n == 1)//只剩下1个猴子时,结束
            {
                for (int t = 1; t <= r; t++)//寻找那个猴子
                {
                    if (number[t] == 1)
                    {
                        k = t;
                        break;
                    }
                }
            }
        }
        printf("%d", k);//输出
    }
    return 0;
}

经典约瑟夫环问题变形

#include<stdio.h>
int a[105];//数组的a[i]表示第i个人是否出局,1表示出局,0表示未出局
int main() {
    int n, m, i = 1; //i表示猴子编号,从1~n
    scanf("%d %d", &n, &m);
    int t = 0; //表示当前的猴子报的数
    int s = 0; //表示当前出局的人数
    while(s != n) {
        if(a[i] == 0) { //猴子未出局才允许报数
            t++;  //报数+1
            if(t == m) { //若猴子报数为m
                a[i] = 1;//该猴出局,标记为1
                s++; //出局人数+1
                if(s == n) { //若此次出局的猴子是最后一只猴,输出
                    printf("%d ", i);
                }
                t = 0; //1重新开始报数
            }
        }
        i++;  //不管上一个猴出没出局,都轮到下一个猴
        if(i > n) { //若到了最后一个猴,回到第一个猴
            i = 1;
        }
    }
    return 0;
}