猴子吃桃问题
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void zhijiefa() //直接使用简单算法计算
{
int i,peach;
peach=1;
for(i=10;i>1;i--)
peach=(peach+1)*2;
printf("简单法:猴子共摘了%d个桃子!\n",peach);
}
void shuzufa() //使用数组结构
{
int tao[10],i;
tao[9]=1; //定义第十天只剩一个桃子
for(i=8;i>=0;i--) //for循环采用逆推计算第一天的桃子
tao[i]=2*(tao[i+1]+1);
printf("数组法:猴子共摘了%d个桃子!\n",tao[0]);
}
int digui(int n) //采用递归法
{
if(n==10) //n表示第十天
return 1;
else
return 2*(digui(n+1)+1);
}
typedef struct Node
{
int data; //数据域
struct Node *next; //链表指针
} SqList;
SqList *head;
void Insert() //创建链表
{
SqList *s,*p;
int day=10;
int peach=1;
head=(SqList *)malloc(sizeof(SqList)); //建立头结点
p=head;
while(day>0)
{
s=(SqList *)malloc(sizeof(SqList)); //生成新的结点
s->data=peach;
p->next=s;
p=s;
peach=(peach+1)*2; //计算总桃子数
day--;
}
p->next=NULL;
p=head;
head=head->next;
free(p);
}
int main()
{
SqList *p;
int sum,day=10;
int count=0;
zhijiefa();
shuzufa();
count=digui(1); //递归调用计算
printf("递归法:猴子共摘了%d个桃子!\n",count);
Insert();
p=head;
while(p!=NULL&&day>0)
{
printf("第%d天:%d个桃子\n",day,p->data);
p=p->next;
day--;
if(day==1) //当天数等于1时,计算总个数
sum=p->data;
}
printf("链结构:猴子共摘了%d个桃子\n",sum);
return 0;
}
运行结果为1534个桃子。