【百鸡问题--穷举法】算法实现

 

  1  /* ******************************************************************
  2  *
  3  *问题描述:百鸡问题(古代数学家张丘建<<算经>>提出)
  4  *
  5  *公鸡每只5元,母鸡每只3元,小鸡3只1元
  6  *用100元钱买100只鸡,求公鸡、母鸡、小鸡只数
  7  *--穷举法
  8  *
  9  ******************************************************************* */
 10  #include < iostream.h >  
 11  // #include<malloc.h>
 12 
 13  int  sum = 100 ; // 所购买三种鸡的总数
 14   
 15 
 16  struct  distribute
 17  {
 18       int  cock_num; // 公鸡数
 19       int  hen_num; // 母鸡数
 20       int  chick_num; // 小鸡数 
 21      distribute  * pNext;
 22      
 23      distribute  operator = (distribute c) // 重载运算符
 24      { 
 25          cock_num = c.cock_num;
 26          hen_num = c.hen_num;
 27          chick_num = c.chick_num;
 28      }
 29  };
 30 
 31  distribute *  Problem_Of_A_Hundred_Chickens( int   & number);
 32  distribute *  Problem_Of_A_Hundred_Chickens( int   & number, int  flag); // 改进的算法
 33  void  print(distribute pDis[], int  n);
 34 
 35  void  main()
 36 
 37       int  num;
 38      distribute *  p = Problem_Of_A_Hundred_Chickens(num, 1 );
 39      print(p,num); 
 40       // print(Problem_Of_A_Hundred_Chickens(num),num);
 41      
 42  }
 43 
 44  distribute *  Problem_Of_A_Hundred_Chickens( int   & number)
 45  {
 46      distribute *  first = NULL;
 47      distribute  * p1 = new  distribute;
 48      distribute  * p2;
 49      number = 0 ;
 50       int  i,j,k;
 51       for (i = 0 ;i < sum;i ++ )
 52      {
 53           for (j = 0 ;j < sum;j ++ )
 54          {
 55               for (k = 0 ;k < sum;k ++ )
 56              {
 57                   if ((i + j + k) == sum && ( 5 * i + 3 * j + k / 3 ) == 100 && (k % 3 == 0 ))
 58                  {
 59                      number ++ ;
 60                       // pDis=(struct distribute*)malloc(sizeof(struct distribute));    
 61                      p1 -> cock_num = i;
 62                      p1 -> hen_num = j;
 63                      p1 -> chick_num = k;
 64                       if (number == 1 )
 65                      {
 66                          first = p1;
 67                      }
 68                      p2 = p1;
 69                      p1 = new  distribute;
 70                      p2 -> pNext = p1;                    
 71                  }
 72              }
 73          }
 74      }
 75      p2 -> pNext = NULL;
 76       // print(first,number); 
 77       return  first;
 78  }
 79  // ------------------------------------------------------------ //
 80  // 改进算法
 81  // ------------------------------------------------------------ //
 82  distribute *  Problem_Of_A_Hundred_Chickens( int   & number, int  flag)
 83  {
 84      distribute *  first = NULL;
 85      distribute  * p1 = new  distribute;
 86      distribute  * p2;
 87      number = 0 ;
 88       int  i,j,k;
 89       for (i = 0 ;i <= 100 / 5 ;i ++ )
 90      {
 91           for (j = 0 ;j <= 100 / 3 ;j ++ )
 92          {
 93              k = sum - i - j;
 94               if (k % 3 == 0 && ( 5 * i + 3 * j + k / 3 ) == 100 )
 95              {
 96                      number ++ ;
 97                      p1 -> cock_num = i;
 98                      p1 -> hen_num = j;
 99                      p1 -> chick_num = k;
100                       if (number == 1 )
101                      {
102                          first = p1;
103                      }
104                      p2 = p1;
105                      p1 = new  distribute;
106                      p2 -> pNext = p1;    
107              }
108          }
109      }
110      p2 -> pNext = NULL;
111       return  first;
112  }
113  void  print(distribute  * pDis, int  n)
114  {
115      cout << " 公鸡数 " << "    " << " 母鸡数 " << "    " << " 小鸡数 " << " \n " ;
116   
117       for ( int  i = 0 ;i < n;i ++ )
118      {
119          cout << "     " << pDis -> cock_num << "        " << pDis -> hen_num << "        " << pDis -> chick_num;
120          cout << endl;
121          pDis = pDis -> pNext;
122      }
123  }
124   

 

 

运行结果:

转载于:https://www.cnblogs.com/wintergrass/archive/2011/03/29/1998317.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值