猴子吃桃问题

1.      猴子吃桃子问题。有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。要求:1)采用数组数据结构实现上述求解;2)采用链式数据结构实现上述求解;3)采用递归实现上述求解。(2)

#include <stdio.h>
#include "malloc.h"
#include <stdlib.h>
#include <stdlib.h>

//////////////////密码子函数
  int mima()
  {
	  int a=123456,h;
	  int r;
	  for(int i=0;i<=2;i++)
	  {
		  printf("please input the password: ");
		  scanf("%d",&h);
		  if(h==a)
		  {
			  printf("登陆成功……\n");
			  r=1;
			  break;
		  }
		  else
			  printf("密码错误……请重新输入\n");
	  }
	  if(i==3)
		  exit(0);
	  return(r);
  }
///////////////////////////菜单函数
  void menu()
  {
	  printf("*******************************************************************************\n\n");
	  printf("                            问题的引出\n");
	  printf("      2.	猴子吃桃子问题。有一群猴子摘了一堆桃子,他们每天都吃当前桃子\n");
	  printf("   的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来\n");	
	  printf(" 这群猴子共摘了多少个桃子?\n\n\n\n");
	  printf("菜单选择:\n\n");
	  printf(        "1、数组计算    2、链表计算   3、递归计算     4、一般方法计算   5、退出\n\n\n");
	  printf("*******************************************************************************\n\n");
  }
  //////////////////////////数组函数
  void shuzu() 
  {
	int a[10];
	int n=1;
	for(int i=9;i>=1;i--)
	{
		a[i-1]=(n+1)*2;
		n=a[i-1];
	}
	printf("用数组数据结构计算桃子总数为: \n");
	printf("%d\n",n);
  }
//////////////////////////用动态链表存储方式实现求解函数
  struct Lnode   //定义节点的结构体
  {
	  int num;
	  struct Lnode *next;
  };
  void lianbiao()
  {
	  struct Lnode *p1,*p2;
	  p1=p2=(struct Lnode*)malloc(sizeof(struct Lnode));//开辟动态链表存储空间
	  p1->num=1;
	  for(int i=1;i<=9;i++)
	  {
		  p2->next=p1;                              //始终使得p1指针指向最后一个新开节点,而p2指向p1
		  p2=p1;
		  p1=(struct Lnode*)malloc(sizeof(struct Lnode));
		  p1->num=(p2->num+1)*2;
	}
	printf("用链表数据结构计算桃子总数为: \n");
	printf("%d\n",p1->num);
  }
/////////////////////用递归方法实现求解
  int digui2(int n,int i)       //子函数digui2,参数n和i接受主函数的参数 x和day
  {
	  if (i>0)
    {
        n = digui2((n+1)*2,--i);     //每一次都用((n+1)*2)的值去调用子函数本身   
    }
    return n;                 //返回结果
  }

 void digui()
 {
    int m;
    int day = 9;             //实现函数调用的次数
    int x = 1;               //最后一天还剩得一个桃子
   m = digui2(x,day);         //调用子函数digui2,并把返回得结果赋给m   

   printf("用递归算法求得桃子总数为:\n");
    printf("%d\n",m);   
 }
//////////////////////////一般方法函数
 void f() 
 { 
	 int day,x1,x2; 
	 day=9; 
	 x2=1; 
	 while(day>0) 
	 {
		 x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ 
		 x2=x1; 
		 day--; 
	 } 
	 printf("用一般方法计算桃子总数为: \n");
	 printf("%d\n",x1); 
 } 
/////////////////////////main主函数
 void main() 
 {
	int n;
	int tea;
	int mima();      //密码函数函数声明
	void menu();
	void digui();    //递归方法子函数声明    
	void shuzu();    //数组方法子函数声明
	void lianbiao(); //链表方法子函数声明
	void f();        //一般方法子函数声明  
	tea=mima();
    if(tea==1)
    menu();
	do
	{
		printf("请选择操作(输入序号1--5): ",n);
		scanf("%d",&n);
		switch (n)
		{
		case 1:shuzu() ;
			break;  
		case 2:lianbiao(); 
			break;
		case 3: digui();
			break;
		case 4:f();
			break;
		case 5:exit(0);
			break;
		}
		printf("\n\n\n");
	}while(n);
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suwu150

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值