兔子和狐狸
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出现
#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++;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: