题目是这样的:1只公鸡5文钱,1只母鸡3文钱,3只小鸡1文钱,现在有100文钱,要刚好买100只鸡,编写程序输出所有可能情况,公鸡,母鸡,小鸡各多少只?用C语言
这是个百鸡问题,使用穷举法解决。我在我的博客中正好讲了
http://www.cnblogs.com/wintergrass/archive/2011/03/29/1998317.html
public static void main(String[] args) {
for(int i=0;i<100;i++){
if(i%3==0){
for(int j=0;j<(100-i);j++){
if(i*1/3+j*5+(100-i-j)*3==100){
System.out.println("雏鸡"+i*1/3+"文买"+i+"只,公鸡"+j*5+"文买"+j+"只,母鸡"+(100-i-j)*3+"文买"+(100-i-j)+"只");
}
}
}
}
}
第二句的for循环写成for(int i=0;i<100;i=i+3)应该更快点,如果你那个,然后在判断,就要一个一个的增加
i代表母鸡数目。不是钱数。
@lanse_yan: 是我看错了,唉,我还以为是用钱来计算呢!
static void Main(string[] args){
int n;
int s=0;
for (int i = 0;i <= 20; i++ )
{
n = (100 - 5 * i) / 3;
for (int j = 0; j>=0&&j <= n;j++ ) {
int m = (100-5*i-3*j)*3;
Console.WriteLine("公鸡数:" + i + " " + "母鸡数:" + j +" " + "小鸡数:" + m);
s++;
}
}
Console.WriteLine("做法的种类数目:" + s);
}
结果是:一共364种做法。
PS:用哪种编程语言并不重要,重要的是你的算法思想,可能我这个算法不是最好的,执行效率估计也不是最高的,希望能够起到抛砖引玉的效果。
#include<iostream>
using namespace std;
void main()
{
int i,j;
for( i=0;i<20;++i)
for( j=0;j<34;++j)
{
if(5*i+j*3+(100-i-j)/3.0==100)
cout<<" 公鸡 "<<i<<" 母鸡 "<<j<<" 小鸡 "<<(100-i-j)<<endl;
}
}
假设公鸡买x只,母鸡买y只,只小鸡是100-x-y只,
由每种鸡的价钱可以得到方程 5x+3y+(1/3)(100-x-y)=100
简化下方程得到7x+4y=100
假如全部买公鸡的话是20只公鸡,也就是说公鸡最多买20只,最少买0只,所以用0到20依次当成x解方程,当y是整数时即表示此方案可以,即可以知道公鸡、母鸡、小鸡的数量。
这是我小学的时候用的方法,是最容易理解的方法。只要想明白了,用什么语言都无所谓,也容易写了。
另一些好点的方法就是楼上各位写的了。
......这是一个线性代数问题..... 貌似几个公式就能搞定.
嗯, 我的计算结果是只有4种个解.
抽象成矩阵:
[15 9 1 ; 1 1 1], 求null, 得[ 4/3 -7/3 1], 另找一个特解[-100 200 0]
则m[4/3 -7/3 1] + [-100 200 0] 为解空间.
由于题目的特殊性, m必须满足
1. 自然数
2. 3的倍数
并且, 每种鸡的数目>=0
问题化简成 75 <= m <= 85, 且m % 3 == 0的问题.
故而, C代码......
高