当前位置: 代码迷 >> C语言 >> [求助]猴子吃桃
  详细解决方案

[求助]猴子吃桃

热度:299   发布时间:2007-10-27 15:55:00.0
这是一道求N天的题,比你的先进了一点点,这时我以前做的,用递归算法
/*
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,有多吃了一个,第二天早上又
将剩下的一半吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半另一个,到第N天
早上再吃时,就只剩一个桃子了。求第一天共摘多少桃子
*/
#include<stdio.h>
int day(int n)
{
int c;
if(n==1) c=1;
else c=(day(n-1)+1)*2;
return c;
}
int main()
{
int a;
while(1==scanf("%d",&a))
{
printf("%d\n\n",day(a));
}
return 0;
}
----------------解决方案--------------------------------------------------------
以下是引用lqcheng在2007-10-27 8:40:33的发言:
[CODE]#include<stdio.h>
#define DAY 10
int main(void){
int n,m,i;
for(n=10;n<10000;n+=2){
m=n;
for(i=1;i<=DAY;i++){
m=m-(m/2+1);
}
if(m==1){
printf("%d\n",n);
n=10000;
}
}
return 0;
}[/CODE]
楼主亲自输入试试。我的结果是2048,当然不对了。m=m-(m/2+1); m/2,若m是奇数(循环几次后有可能),结果就不对了。

结果也许不对,题目说第一天吃掉一半,即不可能是奇数,再多吃一个,依次类推,m=m-(m/2+1)我觉得这个算式应该没什么问题吧?


----------------解决方案--------------------------------------------------------
以下是引用lqcheng在2007-10-27 8:44:39的发言:
刚才没看见第二页,
原来多了个分号啊,
不过我觉得穷举不对

为什么穷举不对?
望赐教


----------------解决方案--------------------------------------------------------
#include <stdio.h>
#define DAY 10
int main(void)
{
int i=1,n,m; //i为猴子第n天吃的桃子,m为猴子(n-1)天
for(n=DAY;n>1;n--);
{
m=i*2+1;
i=m;
if (n==2)
{
printf("%d",m);
}
}
getchar ();
return 0;
}



看看行不行

[此贴子已经被作者于2007-10-28 23:23:49编辑过]


----------------解决方案--------------------------------------------------------
递归,要不就老实去数学推导
----------------解决方案--------------------------------------------------------
以下是引用PKER在2007-10-26 14:20:58的发言:
猴子第一天摘了一些桃子,当天吃一半加1个,以后每天吃前天剩下的一半加1个,10天后只剩下1只,求第一天摘了多少?
我想用正推穷举把总数定为10000内,不知道这种思路对不对,结果是没有输出,也不知道哪里有问题
#include <stdio.h>
#define DAY 10
int main(void)
{
int i,n,m;
for(n=10;n<10000;n+=2); //错误就在多了这个分号,它使得你的循环体为一个空语句,所以真正的小循环体只执行了1次,结束时n=10000
//小循环结束时m!=1,所以不会打印。

{
m=n;
for(i=1;i<DAY;i++)
m=m-(m/2+1);
if (m==1)
{
printf("%d",n);
n=10000;
}
}
getchar ();
}

尽管你这种方法可行,也不推荐这么用,效率太低,而且不确定因素太多,比如你怎么知道10000一定够?或者10000是不是多的太多了?而且你这种穷举法还用的双层循环,如果是个很大的数据就会很慢了。

[此贴子已经被作者于2007-10-28 15:58:39编辑过]


----------------解决方案--------------------------------------------------------
看看这个
http://yzfy.org/bbs/viewthread.php?tid=305




by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.org/
Blog: http://yzfy.programfan.com

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
----------------解决方案--------------------------------------------------------
以下是引用moonwalker在2007-10-28 15:57:43的发言:

尽管你这种方法可行,也不推荐这么用,效率太低,而且不确定因素太多,比如你怎么知道10000一定够?或者10000是不是多的太多了?而且你这种穷举法还用的双层循环,如果是个很大的数据就会很慢了。


我只是想弄清一些事情。
既然方法可行,但是即使把分号去掉也没有得到正确结果,所以我很想知道具体是什么地方出了问题?这个问题困扰我好几天了,可是没人指出来。
很荣幸飞燕大侠也路过了,一直都很崇拜编程高手的女人


----------------解决方案--------------------------------------------------------
以下是引用lqcheng在2007-10-27 8:40:33的发言:
楼主亲自输入试试。我的结果是2048,当然不对了。m=m-(m/2+1); m/2,若m是奇数(循环几次后有可能),结果就不对了。

把错误结果代进去后才理解
#include <stdio.h>
#define DAY 10
int main(void)
{
int i,n,m;
for(n=10;n<10000;n+=2)
{
m=n;
for(i=1;i<DAY;i++)
{
m=m-(m/2+1);
if(m%2!=0)break;//只要出现奇数就退出
}
if (m==1&&i==9) //判断最后1个是不是第10天剩下的
{
printf("%d",n);
break;
}
}
getchar ();
}
演算结果正确,不过不知道是不是凑出来的


----------------解决方案--------------------------------------------------------

# include <stdio.h>

main()
{
int i;
int n=1;
for(i=1;i<=10;i++)
{
n=2*(1+n); // 由(n=n-n/2-1)转换过来的
}
printf("%d\n",n);

}


这样行不?


----------------解决方案--------------------------------------------------------
  相关解决方案