标签:
题目:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
首先来分析一下:
设公鸡为x只,母鸡为y只,小鸡为z只,可的
x+y+z=100
5x+3y+z/3=100
由于每种鸡最少1只,所以公鸡最多能有(100 - 3 - 1) / 5只,母鸡最多能有(100 - 5 - 1) / 3只
至此我们便可以编码实现了
// 买公鸡最大数量
int gongJI = (100 - 3 - 1) / 5;
// 买母鸡最大数量
int muJi = (100 - 5 - 1) / 3;
// 因为每种鸡最少一只所以i从1开始
// 公鸡的数量
for (int i = 1; i <= gongJI; i++) {
// 母鸡的数量
for (int j = 1; j <= muJi; j++) {
// 小鸡的数量
int xiaoJi = 100 - i - j;
// 公鸡的钱+母鸡的钱+小鸡的钱
int money = 5 * i + 3 * j + xiaoJi / 3;
// 因为3只小鸡1分钱所以小鸡的个数取余3等于0,并且花费总额等于100
if (xiaoJi % 3 == 0 && money == 100) {
System.out.println("公鸡:" + i + "只,母鸡:" + j + "只,小鸡:"+ xiaoJi + "只");
}
}
}
运算结果
以上的代码虽然解决了我们的问题,但是在实际的应用中太过于复杂了所以我们可以再次对其进行优化。
从上方的输出结果中可以得知公鸡的数量是4的倍数,母鸡的数量为7的递减,小鸡的数量必定是3的倍数。
设公鸡为x只,母鸡为y只,小鸡为z只,可得:
x+y+z=100 ①
5x+3y+z/3=100 ②
解①可得z=100-x-y; ③
将③带入②可得:
5x+3y+(100-x-y)/3=100;
15x+9y+100-x-y=300;
14x+8y=200;
7x+4y=100;
4y=100-7x;
分析后可将代码改进为
// 总共买多少鸡花多少钱
int sum = 100;
// 买公鸡最大数量
int gongJI = (sum - 3 - 1) / 5;
// 因为每种鸡最少一只所以i从1开始
// 公鸡的数量
for (int i = 4; i <= gongJI; i += 4) {
// 已知公鸡的数量,根据方程4y=100-7x;可得母鸡的数量
int muJi = (sum - 7 * i) / 4;
// 已知公鸡和母鸡的数量便可的小鸡的数量
int xiaoJi = sum - i - muJi;
// 计算总价
int money = 5 * i + 3 * muJi + xiaoJi / 3;
// 小鸡的数量取余3等于0并且总价钱等于100,则符合题意
if (xiaoJi % 3 == 0 && money == sum && muJi > 0) {
System.out.println("公鸡:" + i + "只,母鸡:" + muJi + "只,小鸡:"+ xiaoJi + "只");
}
}
至此,我们变将代码的复杂程度从O(N2)优化成了O(N1)
标签:
原文地址:http://blog.csdn.net/qq_33531634/article/details/51327593