c语言 猴子吃桃问题

苍天魂 2013-07-06 07:58:01
有一些桃子,一只猴子,每天吃1/2+1个桃子,6天吃完。
问:一共有多少个桃子
...全文
1025 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyp520999 2013-07-08
  • 打赏
  • 举报
回复
学习了哈,非常不错,受教了哈
smsgreenlife 2013-07-08
  • 打赏
  • 举报
回复
递归效率太低了
引用 21 楼 cfwyy 的回复:
有点小错哈 语言理解还要加强哈,正确的应该是这样的。

#include<iostream>
using namespace std;
int eat(int day)
{
	return day==1?2:2*(eat(day-1)+1);  //返回的是吃之前的数,最后一天吃之前是2, 答案应是126
}
int main()
{
	cout<<eat(6);
	return 0;
}
[quote=引用 19 楼 cfwyy 的回复:] 来凑热闹了哈,还是递归,顺便也学习了移位哈

#include<iostream>
using namespace std;
int eat(int day)
{
	return day==1?0:2*(eat(day-1)+1);
}
int main()
{
	cout<<eat(6);
	return 0;
}
[/quote]
lifeisshortyouneed 2013-07-08
  • 打赏
  • 举报
回复
有点小错哈 语言理解还要加强哈,正确的应该是这样的。

#include<iostream>
using namespace std;
int eat(int day)
{
	return day==1?2:2*(eat(day-1)+1);  //返回的是吃之前的数,最后一天吃之前是2, 答案应是126
}
int main()
{
	cout<<eat(6);
	return 0;
}
引用 19 楼 cfwyy 的回复:
来凑热闹了哈,还是递归,顺便也学习了移位哈

#include<iostream>
using namespace std;
int eat(int day)
{
	return day==1?0:2*(eat(day-1)+1);
}
int main()
{
	cout<<eat(6);
	return 0;
}
木石行者 2013-07-08
  • 打赏
  • 举报
回复
学习了
lifeisshortyouneed 2013-07-08
  • 打赏
  • 举报
回复
来凑热闹了哈,还是递归,顺便也学习了移位哈

#include<iostream>
using namespace std;
int eat(int day)
{
	return day==1?0:2*(eat(day-1)+1);
}
int main()
{
	cout<<eat(6);
	return 0;
}
LubinLew 2013-07-07
  • 打赏
  • 举报
回复
什么算法啊
引用 5 楼 smsgreenlife 的回复:
当然,最好的算法肯定是下面这样的,它的时间复杂度为O(1),其他的都是O(n)

#include <stdio.h>

void main()
{
	int n = 6;
	printf("%d\n", ((unsigned int)2<<n)-2);
	return;
}
[quote=引用 楼主 u011325883 的回复:] 有一些桃子,一只猴子,每天吃1/2+1个桃子,6天吃完。 问:一共有多少个桃子
[/quote]
LubinLew 2013-07-07
  • 打赏
  • 举报
回复
学习了,顺便总结了一下 http://blog.csdn.net/lgbxyz/article/details/9265795
minnnnmi 2013-07-07
  • 打赏
  • 举报
回复
假设第6天桃子数目为x6;则 (x6)-(x6)/2-1=0; 求得 x6 = 2; 第5天桃子数目为x5;则 (x5)-(x5)/2-1 = (x6);化简得->x5 = 2+2(x6); 第4天桃子数目为x4;则 (x4)-(x4)/2-1 = (x5);化简的->x4 = 2+2(x5); ... 依次类推 (x1) = 2+2(x2); 采用递归的思想:

int f(int n)
{
   if (n==1)
   {
      return 2;
   }

   return 2+2*f(n-1));
}

#include<iostream>
void main()
{
   std::cout<<"桃子数目为:"<<f(6); //桃子数目为:126
   
   system("pause");
}
  
艾薇儿More 2013-07-07
  • 打赏
  • 举报
回复
楼上接分吧
smsgreenlife 2013-07-07
  • 打赏
  • 举报
回复
0.5x+1=x,解得:x=2
引用 12 楼 u011334684 的回复:
它是吃剩下的一半加一个 只有剩下2个的时候 1/2 * 2 + 1 = 2 刚好吃完 [quote=引用 11 楼 lgbxyz 的回复:] 数学不好,为什么肯定最后一天吃2个呢? [quote=引用 9 楼 smsgreenlife 的回复:] 设a(n)为第n天吃完的桃子数,则有:a(1)=2,a(n)=2(a(n-1)+1) 求这个数列得:a(n)=2**(n+1)-2 其中“**”表示幂 [quote=引用 7 楼 lgbxyz 的回复:] 什么算法啊 [quote=引用 5 楼 smsgreenlife 的回复:] 当然,最好的算法肯定是下面这样的,它的时间复杂度为O(1),其他的都是O(n)

#include <stdio.h>

void main()
{
	int n = 6;
	printf("%d\n", ((unsigned int)2<<n)-2);
	return;
}
[quote=引用 楼主 u011325883 的回复:] 有一些桃子,一只猴子,每天吃1/2+1个桃子,6天吃完。 问:一共有多少个桃子
[/quote][/quote][/quote][/quote][/quote]
如此美丽的你 2013-07-07
  • 打赏
  • 举报
回复
u011334684 2013-07-07
  • 打赏
  • 举报
回复
它是吃剩下的一半加一个 只有剩下2个的时候 1/2 * 2 + 1 = 2 刚好吃完
引用 11 楼 lgbxyz 的回复:
数学不好,为什么肯定最后一天吃2个呢? [quote=引用 9 楼 smsgreenlife 的回复:] 设a(n)为第n天吃完的桃子数,则有:a(1)=2,a(n)=2(a(n-1)+1) 求这个数列得:a(n)=2**(n+1)-2 其中“**”表示幂 [quote=引用 7 楼 lgbxyz 的回复:] 什么算法啊 [quote=引用 5 楼 smsgreenlife 的回复:] 当然,最好的算法肯定是下面这样的,它的时间复杂度为O(1),其他的都是O(n)

#include <stdio.h>

void main()
{
	int n = 6;
	printf("%d\n", ((unsigned int)2<<n)-2);
	return;
}
[quote=引用 楼主 u011325883 的回复:] 有一些桃子,一只猴子,每天吃1/2+1个桃子,6天吃完。 问:一共有多少个桃子
[/quote][/quote][/quote][/quote]
LubinLew 2013-07-07
  • 打赏
  • 举报
回复
数学不好,为什么肯定最后一天吃2个呢?
引用 9 楼 smsgreenlife 的回复:
设a(n)为第n天吃完的桃子数,则有:a(1)=2,a(n)=2(a(n-1)+1) 求这个数列得:a(n)=2**(n+1)-2 其中“**”表示幂 [quote=引用 7 楼 lgbxyz 的回复:] 什么算法啊 [quote=引用 5 楼 smsgreenlife 的回复:] 当然,最好的算法肯定是下面这样的,它的时间复杂度为O(1),其他的都是O(n)

#include <stdio.h>

void main()
{
	int n = 6;
	printf("%d\n", ((unsigned int)2<<n)-2);
	return;
}
[quote=引用 楼主 u011325883 的回复:] 有一些桃子,一只猴子,每天吃1/2+1个桃子,6天吃完。 问:一共有多少个桃子
[/quote][/quote][/quote]
u011334684 2013-07-07
  • 打赏
  • 举报
回复
真佩服楼上的啊 厉害
smsgreenlife 2013-07-07
  • 打赏
  • 举报
回复
设a(n)为第n天吃完的桃子数,则有:a(1)=2,a(n)=2(a(n-1)+1) 求这个数列得:a(n)=2**(n+1)-2 其中“**”表示幂
引用 7 楼 lgbxyz 的回复:
什么算法啊 [quote=引用 5 楼 smsgreenlife 的回复:] 当然,最好的算法肯定是下面这样的,它的时间复杂度为O(1),其他的都是O(n)

#include <stdio.h>

void main()
{
	int n = 6;
	printf("%d\n", ((unsigned int)2<<n)-2);
	return;
}
[quote=引用 楼主 u011325883 的回复:] 有一些桃子,一只猴子,每天吃1/2+1个桃子,6天吃完。 问:一共有多少个桃子
[/quote][/quote]
asdf20071203 2013-07-07
  • 打赏
  • 举报
回复
移位运算符,受教了
aproblem 2013-07-07
  • 打赏
  • 举报
回复
额,你们都很牛,我理解成了 (1/2+1)* 6 = 6
smsgreenlife 2013-07-06
  • 打赏
  • 举报
回复
当然,最好的算法肯定是下面这样的,它的时间复杂度为O(1),其他的都是O(n)

#include <stdio.h>

void main()
{
	int n = 6;
	printf("%d\n", ((unsigned int)2<<n)-2);
	return;
}
引用 楼主 u011325883 的回复:
有一些桃子,一只猴子,每天吃1/2+1个桃子,6天吃完。 问:一共有多少个桃子
水平不流 2013-07-06
  • 打赏
  • 举报
回复
引用 3 楼 smsgreenlife 的回复:
刚才操作上出了点问题,正确答案是这样的

#include<stdio.h>

int main()
{
	int n = 2;
	int i ;
	for(i = 1 ; i < 6 ; i++)
	{
		n = 2*(n+1);
	}
	printf("%d\n",n);

}
大意了,你是对的.
smsgreenlife 2013-07-06
  • 打赏
  • 举报
回复
刚才操作上出了点问题,正确答案是这样的

#include<stdio.h>

int main()
{
	int n = 2;
	int i ;
	for(i = 1 ; i < 6 ; i++)
	{
		n = 2*(n+1);
	}
	printf("%d\n",n);

}
加载更多回复(2)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧