一道好玩儿的"移火柴"面试题

还记得小时候增加或移动一根火柴使等式成立的趣味题吗?嘿嘿,今天就和大家分享一道面试题,和“火柴题”很像,因此也更像是趣味题,做起来非常有意思O(∩_∩)O。废话不多说,直接上题:

/*
  下面这段C程序想要输出20个减号,不过,粗心的程序员把代码写错了,你需要把下面的代码修改正确,不过,你只能增加或是修改其中的一个字符,请你给出三种答案。
  
*/
int  n  =   20 ;
for ( int  i = 0 ; i < n; i -- )
{
     printf( " - " );
}

      
    题目很简单,相信任何一个程序员都是能看懂的,这题不考复杂的专业知识,当趣味题做就行了,注意题目要求“给出三种答案”,不好漏解就好。
   
    下面帖上我的解题思路:   

    简单分析一下程序不难看出,“粗心的程序员”把i++写成了i--,导致循环不能执行20次。因此,我们的最终目的就是让for循环执行20次。题目的要求是只能增加或修改一个字符,这么一来,可以修改的也只有"int n=20"和"for (int i=0;i<n;i--)"这两行了。简单尝试一下修改n的数值,很快发现行不通,所以 解题的关键就是在for循环条件里下功夫

    首先我们尝试一下修改"int i=0"中的i值,由于要同时满足i<20和i-20>=20,即40<=i<20,显然不可能。

    接着,尝试修改"i<n"这个条件表达式,稍作思考,我们发现如果给i前面加个符号,变成"-i<n",也就是"i>-20",那么每次循环依次是0>-20,-1>-20 ... -19>-20正好能运行20次,符合题意!这样,第一种解法就出来了:

1   int  n  =   20 ;
2   for ( int  i = 0 - i < n ; i -- )
3   {
4        printf( " - " );
5   }


    再看看修改"i--"有没有希望,改成i++显然是不行了,那改一下变量呢?n--?竟然是可以的!每次循环的条件为0<20,0<19 ... 0<1,同样是20次循环,太神奇了! 这题告诉我们for(int i=0; i<n; n--)也是能做n次循环的 ,虽然我们平常几乎不这么写,因为n往往是不可变的(比如特定数组的长度,容器的size等)。解法二:

1   int  n  =   20 ;
2   for ( int  i = 0 ; i < n; n -- )
3   {
4        printf( " - " );
5   }


    前两种解法总体上还是挺容易想到的,第三种就要绕一些了,我也是想了半天(笨啊o(>﹏<)o)。回到修改"i<n"上,由于在c语言中非0即true,任何一个int值都是可以当布尔值来使的,因此可以试着把"i<n"换成数值,比如i+n,i-n,i*n等等,而i+n恰好符合题意(很诡异的说~)解法三:

1   int  n  =   20 ;
2   for ( int  i = 0 ;  i + n ; i -- )
3   {
4        printf( " - " );
5   }


    好了,这题基本做完了,不知道还有木有别的解法,有的话给我留言哈O(∩_∩)O

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值