/*******************************************************************
*
*问题描述:百鸡问题(古代数学家张丘建<<算经>>提出)
*
*公鸡每只5元,母鸡每只3元,小鸡3只1元
*用100元钱买100只鸡,求公鸡、母鸡、小鸡只数
*--穷举法
*
********************************************************************/
#include<iostream.h>
//#include<malloc.h>
int sum=100;//所购买三种鸡的总数
struct distribute
{
int cock_num;//公鸡数
int hen_num;//母鸡数
int chick_num;//小鸡数
distribute *pNext;
distribute operator=(distribute c)//重载运算符
{
cock_num=c.cock_num;
hen_num=c.hen_num;
chick_num=c.chick_num;
}
};
distribute* Problem_Of_A_Hundred_Chickens(int &number);
distribute* Problem_Of_A_Hundred_Chickens(int &number,int flag);//改进的算法
void print(distribute pDis[],int n);
void main()
{
int num;
distribute* p=Problem_Of_A_Hundred_Chickens(num,1);
print(p,num);
//print(Problem_Of_A_Hundred_Chickens(num),num);
}
distribute* Problem_Of_A_Hundred_Chickens(int &number)
{
distribute* first=NULL;
distribute *p1=new distribute;
distribute *p2;
number=0;
int i,j,k;
for(i=0;i<sum;i++)
{
for(j=0;j<sum;j++)
{
for(k=0;k<sum;k++)
{
if((i+j+k)==sum&&(5*i+3*j+k/3)==100&&(k%3==0))
{
number++;
//pDis=(struct distribute*)malloc(sizeof(struct distribute));
p1->cock_num=i;
p1->hen_num=j;
p1->chick_num=k;
if(number==1)
{
first=p1;
}
p2=p1;
p1=new distribute;
p2->pNext=p1;
}
}
}
}
p2->pNext=NULL;
//print(first,number);
return first;
}
//------------------------------------------------------------//
//改进算法
//------------------------------------------------------------//
distribute* Problem_Of_A_Hundred_Chickens(int &number,int flag)
{
distribute* first=NULL;
distribute *p1=new distribute;
distribute *p2;
number=0;
int i,j,k;
for(i=0;i<=100/5;i++)
{
for(j=0;j<=100/3;j++)
{
k=sum-i-j;
if(k%3==0&&(5*i+3*j+k/3)==100)
{
number++;
p1->cock_num=i;
p1->hen_num=j;
p1->chick_num=k;
if(number==1)
{
first=p1;
}
p2=p1;
p1=new distribute;
p2->pNext=p1;
}
}
}
p2->pNext=NULL;
return first;
}
void print(distribute *pDis,int n)
{
cout<<"公鸡数"<<" "<<"母鸡数"<<" "<<"小鸡数"<<"\n";
for(int i=0;i<n;i++)
{
cout<<" "<<pDis->cock_num<<" "<<pDis->hen_num<<" "<<pDis->chick_num;
cout<<endl;
pDis=pDis->pNext;
}
}
运行结果: