一个火柴模式问题和一个火车运煤问题

前几天在看一个网站上,看到了几个面试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 刘洼村

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值