前几天在看一个网站上,看到了几个面试C/C++语言的趣味问题,火柴模式问题,火车运煤问题。
火柴模式问题:
火柴模式问题大意是,记得小时候玩的的“火柴棍游戏”吗,就是移动一根火柴棍改变一个图或字的游戏。程序也可以这样玩。
比如,下面一个程序,其想要输出20个减号,不过,粗心的程序员把代码写错了,你需要把下面的代码修改正确,不过,你只能增加或是修改其中的一个字符,请你给出三种答案。
int n = 20;
for(int i = 0; i< n; i--){
printf("-");
}
亲爱的读者,你能想到正确答案吗?
下面给你正确答案:
//第一种解法:在for循环中给 i加一个负号
for(int i = 0; -i< n; i--)
//第二种解法:在for循环中把i-- 变成 n--
for(int i = 0; i< n; n--)
//第三种解法:把for循环中的< 变成 +
for(int i = 0; i +n; i--)
上面这个问题,我们可以进行引申,比如:
1) 通过修改、增加一个字符,让其输出21个减号
解法:
若想输出21个减号,这时候变换i和n都不好使,我们只好对i或n的值进行改变。这时候我们想到了按位逻辑关系运算。所以答案如下:
for (int i=0;~i<n;i--)
{
printf("-");
}
解释:i初始值为0,~0为全1,32个1,为补码形式,所以真实值为-1,这时-1<20。然后i--,i变成了-1,-1取反为0,0<20,然后进行-2取反为1,照这样下去,当i=-20是,~i为19,程序结束。i从-1到19,总共输出了21个减号。
2) 通过修改、增加一个字符,让其只输出1个减号
解法:
for (inti=0;i<n;i--);
{
printf("-");
}
for语句后面加上分号,这个循环就变成了死循环,什么都没有输出。后面的printf语句直接就输出了一个减号。花括号可以作为函数定界符,也可以作为局部作用域。
3) 通过修改、增加一个字符,让其不输出减号
这个解法太多了,给出一种,其他的读者可以自己思考。
for (inti=0;i<i;i--)
这里就不介绍了。
火车运煤问题:
题目如下:
你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?
这道题一开始看上去好像是无解的,因为你的火车每一公里就要消耗一吨煤,而到目的地有1000公里,而火车最多只能装1000吨媒。如果你的火车可以全部装下,到目的地也会被全部烧光,一丁点也不剩。所以,很多人的第一反应都是觉得这个不太可能。
如果你一开始就觉得不太可能的话,这是很正常的。不过我不知道你还会不会继续思考下去,如果你不想思考下去了,那么我很为你担忧,因为你可能并不是一个不善于思考的人,而是一个畏难的人,还有可能是一个容易放弃的人。这对于你做好 一个需要大量思考的工作的程序员来说可能并不适合。
这个问题的答案是533吨。可以中途卸下一些,然后回头再运的方式。
欢迎读者批评指正。
By 刘洼村