狐狸抓兔子 问题
围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须先找到我,我就藏身于这十个洞中的某个洞。你从1号洞找,下次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,再隔3个…以后在这个圆圈中如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。
问兔子究竟藏在哪个洞里?
#include <stdio.h>
void main()
{
int a[10] = {1,};
int i = 0;
//int j = 0;
//int flag ;
printf("%d \n",a[0]);
for(i = 0;i < 1000;i++)
{
if(i <100)
a[i+1] = a[i] + (i+2);
if(a[i+1] > 9)
{
a[i+1] = a[i+1] % 10;
//flag = 0;
}
printf("%d ",a[i+1]);
printf("\n");
}
}
写到这 输出的是 狐狸进过的洞。但是要的是狐狸没进过的洞。再怎么写啊? 哪位大神帮帮忙。我是新手。
[最优解释]
#include <stdio.h>
/* flag[0] 标记的是10号洞
1表示狐狸进过的洞,0表示
狐狸没进过的洞
结果是兔子可能在:2、4、7或9号洞
*/
void main()
{
int i=0;
int flag[10]={0};
for(i=1;i<1001;i++)
{
flag[((i*(i+1))/2)%10]=1;
}
for(i=0;i<10;i++)
{
printf("%d:%d\n",i,flag[i]);
}
}
[其他解释]
比较弱的办法:编程:来个数组bj[10] = {0};
然后,第一次进1号洞,把bj[0]设为1,第二次进3号洞,把bj[2]也设为1,第三次进6号洞,把bj[5]设为1,第四次10号洞,把bj[9]设为1,第五次5号洞bj[4]=1……知道循环到第1000次,看一看bj的哪个元素还是0,那就是标记数+1号洞了。。比如bj[i]=0,兔子就在i+1号洞
比较强的办法:不用编程就没有压力,分析,过11个洞和过1个洞是一样的效果。。。过100个洞和一个洞也不过是一样的效果。。。
设数列An=1+2+...+n。。。
罗列前20项结果是1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210
尾数没有2,4,7,9,而且到了第20项,发现尾数归0了,我们只关心尾数,所以从第21项开始,尾数和前20项的尾数会一摸一样,于是,2,4,7,9就是答案
[其他解释]
想说明的是:
第N次狐狸所进的洞应该为:N*(N+1)/2%10,若结果为0表示所在的洞为10号洞。
[其他解释]
变形的约瑟夫环问题吧.
[其他解释]
3qqqqqq
[其他解释]
参考答案:
/*
围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须先找到我,我就藏身于这十个洞中的某个洞。
你从1号洞找,下次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,再隔3个…以后在这个圆圈中如此类推,
次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。
问兔子究竟藏在哪个洞里?
*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int index,hole,result;
int loop[11]={0};
hole=0;
for(index=1;index<=1000;index++)
{
hole+=index;
result=hole%10+1;
loop[result]++;
}
printf("结果是:\n");
for(index=1;index<=10;index++)
{
if(loop[index]==0)
{
printf("%d\n",index);
}
}
return 0;
}
[其他解释]
/****************************************************************************
围绕山顶有10个洞,一只兔子和一只狐狸相遇了,狐狸要吃兔子.
兔子对狐狸说:你可以吃掉我,但是必须先找到我,我就藏在这10个洞中
你先到1号洞找我,若没找到,则第二次到隔一个洞找我,即3号洞,第三次隔两个洞找我
即6号洞.以后以此类推,找到就可以吃掉我。
狐狸答应了,但是狐狸进进出出1000次后,也没找到兔子,问兔子在哪洞
*****************************************************************************/
#include<stdio.h>
#define N 10//假设有十个洞
void main()
{
int a[N]={0},i,k=0;//定义"1"代表狼进去过"0"代表狼没进去过.
for(i=0;i<1000;)
{
a[k]=1;
i++;
k=(k+i+1)%N;//用K表示出狼依次要进入的洞的号码"0 ~ N-1"
}
printf("兔子可以在");
for(i=0;i<N;i++)
if(a[i]==0)//最后还是0的 表示这个洞狼没进去过,是安全的.
printf("%2d ",i+1);
printf("号洞中的任意一个\n");
}