昨天去3G门户面试java编程题
100匹马背100担粮。 大马一匹背3担,中马一匹背2担。小马2匹背一担。请编程输出所有满足条件的情况.<注意是编程,用程序解决,最好不要用伪代码.> --------------------编程问答-------------------- 条件x+y+z= 100
3x+2y+z/2=100;
极限 x=33,y=50,z =100
做个3层嵌套 ,满足条件的就是 --------------------编程问答-------------------- 楼上加个条件 z%2==0
这题和百钱买百鸡类似 --------------------编程问答-------------------- 贪心算法 --------------------编程问答--------------------
--------------------编程问答-------------------- 上面的有点错误,应该为:
for(Integer a=0;a<34;a++){
for(Integer b=0;b<(100-3*a)/2;b++){
for(Integer c=0;c<(100-3*a-2*b)*2;c++){
if((3*a+2*b+0.5*c)==100){
System.out.println("a="+a.toString()+",b="+b.toString()+",c="+c.toString());
break;
}
}
}
}
b<=(100-3*a)/2和c<=(100-3*a-2*b)*2; --------------------编程问答-------------------- 顶一下!! --------------------编程问答-------------------- 这个考题实在没什么水平,就是考小学数学而已,.......... --------------------编程问答--------------------
--------------------编程问答-------------------- 这个不就是书后习题嘛~ --------------------编程问答--------------------
if((3*a+2*b+0.5*c)==100 && 100 == a + b + c){
这个确实, 只是不知道LZ当时写出来米有 --------------------编程问答--------------------
public class jisuan {--------------------编程问答-------------------- 本来我想法同一楼的 但是实际写了下 发现两层循环就可以啦
public static final int horse = 100;
public static final int rice = 100;
public static int xNum;
public static int yNum;
public static int zNum;
public static int count = 0;
public static void main(String[] args) {
for (xNum = 1; xNum < horse; xNum++) {
for (yNum = 1; yNum < horse; yNum++) {
for (zNum = 1; zNum < horse; zNum++) {
if (3 * xNum + 2 * yNum + 0.5 * zNum == rice && xNum + yNum + zNum == horse) {
count ++;
System.out.println("第" + count + "种答案。");
System.out.println("大的" + xNum + "," + "中的" + yNum + "," + "小的" + zNum);
System.out.println("-------------华丽的分割线-------------");
}}}}}}
int a0,a1,a2;
for(a0=0;a0<33;a0++){
for(a1=0;a1<50;a1++){
a2=200-6*a0-4*a1;
if(a2<0){
break;
}
System.out.println(a0+" "+a1+" "+a2);
}
}
--------------------编程问答-------------------- 消元
把三元一次方程组变成二元一次方程
就可以减少一层循环了 --------------------编程问答-------------------- 额,为什么我看到这样的题就觉得很难,实际上我还没看内容 --------------------编程问答-------------------- 是挺简单的 --------------------编程问答-------------------- 两个小马怎么背一旦? 蛋疼的题目! 毫无意义! --------------------编程问答--------------------
还缺个条件 a2>100也要中断 --------------------编程问答--------------------
for(int a=0;a*3<=100;a++)--------------------编程问答--------------------
{
for(int b=0;b*2<=100;b++)
{
for(int c=0;c<=100;c++)
{
if((a+b+c)==100&&(a*3+b*2+0.5*c)==100)
{
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("--------");
}
}
}
}
--------------------编程问答-------------------- 既然题目有大马,中马,小马的出现,我假设大马中马,小马都不为0 --------------------编程问答-------------------- 如果说大马,中马,小马必须至少有一匹,那么11楼的程序是正确的;
public class TestHorseAndGrain {
static final int HORSE_QUANTITY = 100;//粮食总量
static final int GRAIN_QUANTITY = 100;//大马中马小马总和
static final int BIG_CAPACITY = 3;//每只大马的载重量
static final int MIDDLE_CAPACITY = 2;//每只中码的载重量
static final double LITTLE_CAPACITY = 0.5;//每只小马的载重量
public static void main(String[] args) {
int big,middle,little;;//分别表示大马,中马,小马的数量
for(big = 1; big*BIG_CAPACITY<=GRAIN_QUANTITY;big++) {
for(middle=1; middle*MIDDLE_CAPACITY<=(GRAIN_QUANTITY-big*BIG_CAPACITY);middle++) {
little = HORSE_QUANTITY-big-middle;
int grain=GRAIN_QUANTITY-big*3-middle*2;
if(little>0&&little%MIDDLE_CAPACITY==0&&little*LITTLE_CAPACITY==grain)
System.out.println(big + " " +middle + " " + little );
}
}
}
}
如果说大马,中马,小马的数量不限,有可能有,有可能没有,那么4楼的程序是正确的。
总之,我觉得两个答案都对,因为出题者没有说名哪种情况。
--------------------编程问答-------------------- 1楼和4楼是正解,当然4楼直接把程序实现了。更佳。
此题有一个关键点是考效率,要突出极限。
极限 x=33,y=50,z =100
循环第一层不能超过33(另两层如果作为第一层循环同理)
不注意的很可能三层都是100循环。那样你只能得60分
如果注意了极限,那你至少90分。 --------------------编程问答-------------------- 这样应该可以
--------------------编程问答-------------------- 谁能告诉我为什么大马的最大值是33,怎么我算的是20呢
public static void main(String[] args)
{
int big, middle, little;
double total;
for (big = 0; big <= 33; big++)
{
for (middle = 0; middle <= 50; middle++)
{
little = 100 - big - middle;
total = 3 * big + 2 * middle + 0.5 * little;
if (Math.abs(total - 100) < 0.01)
{
System.out.println(big + " " + middle + " " + little);
}
}
}
}
public class CalcHorse {
public static void main(String[] args) {
for(int b=0;b<=getBigCount(100);b++){
for(int m=0;m<=(100-3*b)/2;m++){
for(int l=0;l<=(100-3*b-2*m)*2;l++){
if((b*3+m*2+l/2)==100 && (b+m+l)==100)
System.out.println("big horse "+b+" middle horse "+m +"little horse" +l);
}
}
}
}
public static int getBigCount(int total){
//b+l=100;
//3b+l/2=100;
int bmax=total/5;
return bmax;
}
}
//为什么是33呢 33匹大马能背99包,剩下的一包必须由67匹马来背,不符合要求,看我的 --------------------编程问答-------------------- 天马流星拳 --------------------编程问答--------------------
如果大马是21的话,剩下79匹马,37担粮,只剩中马和小马,那么即使全是小马,也得需要79/2=39.5担粮才能够100匹马,37<39.5所以37担粮无法够79匹马 --------------------编程问答-------------------- 学习....学习 --------------------编程问答--------------------
额。。没看见你自己回答的。为什么自己又来一步,你把int b=0;b<=getBigCount(100);b++里的getBig(100)换成任意大于20的整数都没任何问题 --------------------编程问答-------------------- 一次循环就可以,消去一个变量。。。
void fun()
{
int i;
int old, mid, yog;
for (i = 0; i <= 20; i++)
{
old = i;
mid = (100 - 5 * old) / 3;
if ( (mid * 3 + old * 5) != 100)
continue;
yog = 200 - 6 * old - 4 * mid;
if ((yog % 2) == 1)
continue;
printf("old = %-4d, mid = %-4d, young = %-4d, total = %-4d, grain = %-4d\n", old, mid, yog, old + mid + yog, 3 * old + 2 * mid + yog /2);
}
}
结果:
[code=C/C++]
old = 2 , mid = 30 , young = 68 , total = 100 , grain = 100
old = 5 , mid = 25 , young = 70 , total = 100 , grain = 100
old = 8 , mid = 20 , young = 72 , total = 100 , grain = 100
old = 11 , mid = 15 , young = 74 , total = 100 , grain = 100
old = 14 , mid = 10 , young = 76 , total = 100 , grain = 100
old = 17 , mid = 5 , young = 78 , total = 100 , grain = 100
old = 20 , mid = 0 , young = 80 , total = 100 , grain = 100
[/code] --------------------编程问答-------------------- 这和百钱买百鸡是不是有点换汤不换药的意思呢? --------------------编程问答-------------------- 贪婪法 --------------------编程问答-------------------- 那如果得到
5个大马+3个中马=100
的话 得知 大马最小是2 每次涨3 最大20
这样就相当简单了
//5*a0+3*a1=100;--------------------编程问答-------------------- --------------------编程问答-------------------- 遇到这种题就迷糊 --------------------编程问答--------------------
int a0,a1,a2;
for(a0=2;a0<=20;a0+=3){
a1=(100-5*a0)/3;
a2=100-a0-a1;
System.out.println(a0+" "+a1+" "+a2);
}
你没看我列的公式吗?
//b+l=100;
//3b+l/2=100;
我说的"天马流星拳",只是为了渲染气氛而已(幽默一下).哈 --------------------编程问答-------------------- 这里面 要有优化 如果数据很大 三层的效率很低 所以把三元方程转换为二元方程 效率会提高很多
我感觉这道题目主要考的是算法效率问题 --------------------编程问答--------------------
++ --------------------编程问答-------------------- 鸡兔同笼~~~ --------------------编程问答-------------------- 百钱买百鸡的问题!考试刚考过。。。。 --------------------编程问答-------------------- 【分析】
依题意:设大马匹数为X(匹),中马y(匹),小马z(匹).那么可以列出方程
x+y+z=100
3x+2y+z/2=100
0<=x<=33
0<=y<=50
0<=z<=100并且z必须能被2整除(因为一只小马背不动一担粮.)
其中x,y,z都是整数.
解出x,y,z
以上的思路用java来实现,如下:
class Horse
{
int x;//大马匹数
int y;//中马
int z;//小马
int i=0;//用于统计满足条件的个数
int count_horse;//马的总匹数
int count_foot;//粮食的总担数
public void Operation()
{
for(z=0;z<=100;z++)
{
for(y=0;y<=50;y++)
{
x=100-y-z;
if( (x>=0) && (x<=33) && (y>=0) && (y<=50) && (z>=0) && (z<=100) && (z%2==0) )
{
if( ((x+y+z)==100) && ((3*x+2*y+z/2)==100) )
{
i++;
System.out.println("第【"+i+"】种情况--大马:"+x+" 中马:"+y+" 小马:"+z);
//检测结果是否满足题意
count_horse=x+y+z;//马的匹数
count_foot=3*x+2*y+z/2;//粮食的总担数
System.out.println("[检测]马的总匹数:"+count_horse+" 粮食的总担数:"+count_foot+"\n");
}
}
}
}
}
public static void main(String[]args)
{
Horse h=new Horse();
h.Operation();
}
}
打印结果:
第【1】种情况--大马:2 中马:30 小马:68
[检测]马的总匹数:100 粮食的总担数:100
第【2】种情况--大马:5 中马:25 小马:70
[检测]马的总匹数:100 粮食的总担数:100
第【3】种情况--大马:8 中马:20 小马:72
[检测]马的总匹数:100 粮食的总担数:100
第【4】种情况--大马:11 中马:15 小马:74
[检测]马的总匹数:100 粮食的总担数:100
第【5】种情况--大马:14 中马:10 小马:76
[检测]马的总匹数:100 粮食的总担数:100
第【6】种情况--大马:17 中马:5 小马:78
[检测]马的总匹数:100 粮食的总担数:100
第【7】种情况--大马:20 中马:0 小马:80
[检测]马的总匹数:100 粮食的总担数:100
Java编程技术交流QQ群:171396965 技术需要交流,技术需要与时俱进.这里是优秀爱好Java编程的集聚地,我们一起学习,共同进步.加入时请注明Java字样,谢谢. 博客:http://blog.csdn.net/StellaAh/article/category/866574 --------------------编程问答--------------------
+1 --------------------编程问答-------------------- 小马表示自己没有这么没力 --------------------编程问答-------------------- 为什么看到这样的题目,最先想到的是数学方程呢?因为这就是一个数学题,在小学或初中的时候还做过这样的试题,那么:是不是说现在编程只能解决小学或初中的数学问题
这样的题目进行讨论,总感觉怪怪的 --------------------编程问答-------------------- +1 --------------------编程问答-------------------- 有点像奥赛题哦 --------------------编程问答-------------------- 从数学上分析,设x,y,z为大马,中马,小马
x+y+z = 100 (1)
3x+2y+z/2 = 100 (2)
上述两式联立并消去z可得:
5x+3y = 100 (3)
当x = 21时,大马背运货物为3x = 63
这种情况下即使中马y = 0,小马为79,则小马背运货物为z/2 = 39
此时3x + 2y + z/2 = 102 > 100,因此大马数量x必须小于等于20
以下为代码:
--------------------编程问答--------------------
public class PortageCompute {
public PortageCompute() {
super();
}
public static void main(String[] args) {
int smallHorse = 0;
int midHorse = 0;
int result_count = 0;
for (int bigHorse = 0; bigHorse <= 20; bigHorse++) {
/* 根据式(3) */
if ((100 - 5 * bigHorse) % 3 != 0) {
continue;
} else {
result_count++;
midHorse = (100 - 5 * bigHorse) / 3;
smallHorse = 100 - bigHorse - midHorse;
System.out.println("第" + result_count + "种算法: 大马[" + bigHorse +
"]匹,中马[" + midHorse + "]匹,小马[" +
smallHorse + "]匹。");
}
}
}
}
不奇怪,编程思想,就是属于数学思想的范畴. --------------------编程问答--------------------
谢谢分享,你这种写法要简便些! --------------------编程问答--------------------
那你是怎么做的呢?有没有更好的方法? --------------------编程问答-------------------- 不错,学习了!!! --------------------编程问答-------------------- 这个感觉没多大意思 --------------------编程问答-------------------- 这个问题讨论了挺多
还发现真是大马递增3! --------------------编程问答-------------------- 水平有限,飘过。 --------------------编程问答--------------------
for 循环嵌套,很多初级编程 的考试题...同理百钱买百鸡 --------------------编程问答-------------------- 刚学python。拿来试试手
x=range(0,100,3)
y=range(0,100,2)
z=range(0,200)
for a in x:
for b in y:
for c in z:
if(a*3+b*2+c)==100:
print(a,b,c) --------------------编程问答-------------------- 帮顶! --------------------编程问答-------------------- 再帮忙顶下 --------------------编程问答-------------------- 穷举法,就是百鸡百钱。。 --------------------编程问答-------------------- x=1,Y=48,z=51
x=4,Y=44,z=52
x=5,Y=42,z=53
x=8,Y=38,z=54
x=9,Y=36,z=55
x=12,Y=32,z=56
x=13,Y=30,z=57
x=16,Y=26,z=58
x=17,Y=24,z=59
x=20,Y=20,z=60
x=21,Y=18,z=61
x=24,Y=14,z=62
x=25,Y=12,z=63
x=28,Y=8,z=64
x=29,Y=6,z=65
x=32,Y=2,z=66
var
x,y,z:integer;
begin
for x:= 1 to 100 do
begin
for y:= 1 to 100 do
begin
for z:= 1 to 100 do
begin
if (x+y+z=100) and (3*x+2*y+(z mod 2)=100) then
begin
memo1.Lines.Add('x='+inttostr(x)+',Y='+inttostr(y)+',z='+inttostr(z));
end;
end;
end;
end;
end;
不知道对不对。 --------------------编程问答-------------------- 死劲循环吧,没什么含量 --------------------编程问答-------------------- /**
171. * 100匹马背100担粮。 大马一匹背3担,中马一匹背2担。小马2匹背一担。请编程输出所有满足条件的情况
172. * 6i+4j+k = 200
173. * i+j+k = 100
174. * 相减得出
175. * 5i + 3j = 100
176. * k = 100 - i - j;
177. * 求所有 ijk的组合
178. */
179. public static void horseTest() {
180.
181. for (int i = 0; i <= 20; i++) {
182. int j = (100 - i * 5) / 3;
183. int k = 100 - i - j;
184.
185. if (i * 3 + j * 2 + k * 0.5 == 100)
186. System.out.println("i:" + i + "\tj:" + j + "\tk:" + k);
187. }
188.
189. }
190.
--------------------编程问答-------------------- --------------------编程问答--------------------
这个想法太厉害了,搞算法的童鞋注意了 --------------------编程问答-------------------- 类似百钱百鸡!! --------------------编程问答--------------------
很好,两层循环。面向对象 --------------------编程问答-------------------- 涨见识了,大意不得 --------------------编程问答-------------------- Mark,学习了。
--------------------编程问答-------------------- 高人!!!
不考虑范围的三层循环,循环次数是100×100×100,是100万次循环;
简单考虑范围的三层循环,是33×50×100,是165000此循环,效率角度,优化了94%;
充分考虑范围的最优算法,只循环了7次,相比简单考虑三层循环,效率优化了97%以上,而相比不考虑范围的三层循环,则是效率接近100%的提升。
对于复杂的运算,这个效果是显著的。虽然题并不难,解决办法差别却很大。
--------------------编程问答-------------------- 以一匹马一份粮食为参照:
每+1大马 相当于多加了2份粮食
中马 相当于加了 1份粮食
两匹小马 相当于消耗了一匹马
每加一匹大马必须 由 4匹小马来中和才相当于 5匹马5份粮食 100以内最大可以为20种可能
一匹中马 需要两匹小马中和 3匹马3份
所以必须能整除 5 和 3
而且 三匹马 必须和为100
--------------------编程问答--------------------
for(int i = 0;i<=20;i++)
{
int mid = (100 - 5i ) / 3 ;
int yong = 100-i-mid;
if(6*i+4*mid+yong == 200) // 都扩大2倍
{
System.out.println(i+","+mid+","+yong);
}
}
这句话好需要 if((3*a+2*b+0.5*c)==100){
System.out.println("a="+a.toString()+",b="+b.toString()+",c="+c.toString());
break;
中的break吗? --------------------编程问答--------------------
我认为这句话 for (xNum = 1; xNum < horse; xNum++) 中的xNum 等于零比较合适?
不知说的对不对,冒昧了,请原谅! --------------------编程问答-------------------- if(little>0&&little%MIDDLE_CAPACITY==0&&little*LITTLE_CAPACITY==grain)
这句话有一点不明白啊,能不能帮忙解释一下啊?
--------------------编程问答-------------------- 来学习学习! --------------------编程问答--------------------
4楼的少了个条件,答案不对
--------------------编程问答-------------------- 路过,学习 --------------------编程问答--------------------
这个是效率最高的吧 但是有点瑕疵 a2%2 吧 --------------------编程问答-------------------- 林子大了神马鸟都有 --------------------编程问答-------------------- 可以得到5x+3y=100,那两次循环就可以了 --------------------编程问答-------------------- 高手如云!
补充:Java , Java SE