C语言兔子和狐狸出现问题

兔子和狐狸
Description

山顶有n个洞围成一圈(编号按顺序依次编号1到n),一只兔子和一只狐狸分别住在洞里,狐狸总想吃掉兔子。一天兔子对狐狸说:你想吃掉我有一个条件,你从第一个洞出发(编号为1),第一次先到第一个洞找我,第二次隔一个洞找我,第三次隔二个洞找我,第四次隔三个洞找我,…,依此规律类推,寻找次数不限。我躲在一个洞里不动,只要你能找到我,你就可以吃我饱餐一顿,在找到我之前你不能停。狐狸一想,只有n个洞,次数又不限,哪有找不到的道理。狐狸马上就答应了兔子的条件,结果狐狸围着山顶跑了m圈,跑断了腿也没找到兔子。请问兔子躲哪个洞里?

Input
2个正整数n和m,n表示洞的数目,m表示狐狸跑动圈数,其中n不超过100,m不超过10000。

Output
输出兔子可以躲在哪些洞里?如果有多种选择,按从小到大的顺序依次输出洞的编号,相互之间用1个空格隔开。

如果没有洞可以躲的话,请输出”No choice“。

Sample Input 1 :
10 2

Sample Output 1
2 4 7 8 9

我想请问一下,为什么我的结果会有5出现

img

#include 
#include 
int main()
{
    int a[100],n,m,i=0,j,k=2;
    
    scanf("%d%d",&n,&m);
    
    memset(a,0,100*sizeof(int));
    
    for(j=1;i<=m*n;)
    {
        a[j]=1;
        if(j>n)
         j=j-n;
         
        j=j+k;
        i=i+k;
        k++;
    }
    
    for(i=1;i<=n;i++)
    {
        if(a[i]==0)
         printf("%d ",i);
    }
    return 0;
}

你的代码有一个问题,当j大于n时,你使用了j=j-n。这样实际上是不对的,因为如果编号为j的洞在第一个洞的前面,那么不能减去n。正确的做法应该是让j取模n,也就是j=j%n。

具体实现可以这样:

for(j=1;i<=m*n;)
{
    a[j]=1;
    j=(j+k-1)%n+1;
    i=i+k;
    k++;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^