百钱买百鸡问题解题思路.doc
2005-05-27 11:18
253 查看
Pcw-cjy@vip.sina.com编程擂台
Pcw-soft@vip.sina.com
软件世界
姓氏排序:pcw-ys@vip.sina.com
拿到这个题目,心中的第一个想法就是,这肯定就是一个三元一次方程组求解的问题,先敲定一个变量的值,再利用另外两个值循环。
但是,就本题目来讲,一味的蛮干循环,将会增加程序的复杂度,效率肯定不高,经简单分析:此题中所求的变量值有一个最基本的值域范围,我们设定所求的公鸡数目变量为maleChick_num、母鸡数目为femaleChick_num、雏鸡数目为childChick_num,这样一个基本值域可以确定:maleChick_num∈[0,20], femaleChick_num∈[0,33], childChick_num无论多少肯定在0~100之间,但是由题目“每3只鸡子价值一钱”可知,雏鸡的数目必定是3的倍数,这样就可确定雏鸡的数目是100内的3的倍数。好了,范围一步步缩小,题目结果顷刻可见!
围绕题目,心中必须有这两个方程
1).
maleChick_num*5+femaleChick_num*3+childChick_num/3==100
2).
maleChick_num+femaleChick_num+childChick_num==100
第一个方程是根据总钱数而定,无论三样鸡子各买多少,但总“资本”是定额;第二个方程是根据所有鸡子的数目而定,无论您钱有多少,“市场”的“资源”是有限的(仅100只鸡子)。
为了得到雏鸡数目的精确值域,定义一个中间变量childChick_tempNum[j],用来存储100内3的倍数,如下:
int
j = 0;
for
(int i = 1; i <= 100; i++) {
if
(i % 3 == 0) {
childChick_tempNum[j]
= i;
j++;
}
}
此时,childChick_tempNum[j]数组的值为{
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,
96,99}
人工活已经晚了,剩下的就是机器的事情了:
列出三个循环,以前面两个方程作为判断条件,得出最宗的结果,循环部分的代码如下:
for(maleChick_num=0;maleChick_num<=20;maleChick_num++){
for(femaleChick_num=0;femaleChick_num<=33;femaleChick_num++){
for(int
i=0;i<childChick_tempNum.length;i++){
childChick_num
= childChick_tempNum[i];
if(maleChick_num*5+femaleChick_num*3+childChick_num/3==100
&& maleChick_num+femaleChick_num+childChick_num==100){
System.out.println("百钱买百鸡的结果可以是:/n/t/t雏鸡"+childChick_num+"只/t母鸡"+femaleChick_num+"只/t公鸡"+maleChick_num+"只");
}
}
}
}
程序输出的最后可行结果有四组,分别为:
1〉雏鸡75只 母鸡25只 公鸡0只
2〉雏鸡78只 母鸡18只 公鸡4只
3〉雏鸡81只 母鸡11只 公鸡8只
4〉雏鸡84只 母鸡4只 公鸡12只
Pcw-soft@vip.sina.com
软件世界
姓氏排序:pcw-ys@vip.sina.com
拿到这个题目,心中的第一个想法就是,这肯定就是一个三元一次方程组求解的问题,先敲定一个变量的值,再利用另外两个值循环。
但是,就本题目来讲,一味的蛮干循环,将会增加程序的复杂度,效率肯定不高,经简单分析:此题中所求的变量值有一个最基本的值域范围,我们设定所求的公鸡数目变量为maleChick_num、母鸡数目为femaleChick_num、雏鸡数目为childChick_num,这样一个基本值域可以确定:maleChick_num∈[0,20], femaleChick_num∈[0,33], childChick_num无论多少肯定在0~100之间,但是由题目“每3只鸡子价值一钱”可知,雏鸡的数目必定是3的倍数,这样就可确定雏鸡的数目是100内的3的倍数。好了,范围一步步缩小,题目结果顷刻可见!
围绕题目,心中必须有这两个方程
1).
maleChick_num*5+femaleChick_num*3+childChick_num/3==100
2).
maleChick_num+femaleChick_num+childChick_num==100
第一个方程是根据总钱数而定,无论三样鸡子各买多少,但总“资本”是定额;第二个方程是根据所有鸡子的数目而定,无论您钱有多少,“市场”的“资源”是有限的(仅100只鸡子)。
为了得到雏鸡数目的精确值域,定义一个中间变量childChick_tempNum[j],用来存储100内3的倍数,如下:
int
j = 0;
for
(int i = 1; i <= 100; i++) {
if
(i % 3 == 0) {
childChick_tempNum[j]
= i;
j++;
}
}
此时,childChick_tempNum[j]数组的值为{
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,
96,99}
人工活已经晚了,剩下的就是机器的事情了:
列出三个循环,以前面两个方程作为判断条件,得出最宗的结果,循环部分的代码如下:
for(maleChick_num=0;maleChick_num<=20;maleChick_num++){
for(femaleChick_num=0;femaleChick_num<=33;femaleChick_num++){
for(int
i=0;i<childChick_tempNum.length;i++){
childChick_num
= childChick_tempNum[i];
if(maleChick_num*5+femaleChick_num*3+childChick_num/3==100
&& maleChick_num+femaleChick_num+childChick_num==100){
System.out.println("百钱买百鸡的结果可以是:/n/t/t雏鸡"+childChick_num+"只/t母鸡"+femaleChick_num+"只/t公鸡"+maleChick_num+"只");
}
}
}
}
程序输出的最后可行结果有四组,分别为:
1〉雏鸡75只 母鸡25只 公鸡0只
2〉雏鸡78只 母鸡18只 公鸡4只
3〉雏鸡81只 母鸡11只 公鸡8只
4〉雏鸡84只 母鸡4只 公鸡12只
相关文章推荐
- 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
- C#的解题思路(1):不重复随机数的产生问题
- NYoj_07_街区最短路径问题 解题思路和代码
- leetCode 66.Plus One (+1问题) 解题思路和方法
- leetCode 52.N-Queens II (n皇后问题II) 解题思路和方法
- C#的解题思路(1):不重复随机数的产生问题
- C#的解题思路(1):不重复随机数的产生问题
- 序列中的最多除数问题(解题思路同样适用于最大递增序列)
- leetCode 51.N-Queens (n皇后问题) 解题思路和方法
- C#的解题思路(1):不重复随机数的产生问题 .
- 浙大PAT 2-09. 装箱问题模拟 (解题思路)
- dp方法论——由矩阵相乘问题学习dp解题思路
- 浙大PAT 1008. 数组元素循环右移问题 (解题思路)
- 杭电 2553 N皇后问题 递归回溯 打表 附解题思路
- 关于栈的应用-括号匹配问题的两种解题思路
- 背包问题解题思路
- 【POJ1077】Eight 八数码问题,解题报告+思路+代码
- c中常见的矩形问题的解题思路与方法
- 程序员面试金典(动态规划):1分,5分,10分,25分硬币面值组合问题(解题思路)
- suduko及8皇后问题及相关问题的解题思路