文章转载自陈大大的博客“火柴棍式”程序员面试题,
下面是一个C程序,想要输出20个减号,粗心的程序员把代码写错了,你需要修改一下的代码,但是你只能添加或修改其中的一个字符,请给出三种方案:
int n = 20;
for(int i = 0; i < n; i--)
{
printf("-");
}
不要以为这题不是很难,我相信你并不那么容易能找到3种方法。我觉得,如果你能在10分钟内找出这三种方法,说明你真的很聪明,而且反应很快。当然,15分钟内也不赖。不过,你要是30分钟内找不到三种方法,当然,不说明你笨了,最多就是你的反应还不够快。嘿嘿。就当是玩玩吧。
下面是我的答案:
//第一种解法:在for循环中给n加一个负号
for(int i = 0; i < -n; i--)
//第二种解法:把 n 初始化成 -20
int n = -20;
//第三种解法:把for循环中的 i 初始化成40
for(int i = 40; i < n; i--)
不过,我要告诉你,以上这些答案都不对,不满足for循环条件(我就知道你会偷看答案的),不过,顺着这些思路走很接近了。呵呵。
下面是正确答案——
//第一种解法:在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--)
关于前面的两种解法,估计大家都木有问题,第三种解法对于不是很深入了解C语言中for循环的同学们来说理解就稍微拐点弯,还记得for循环吗?
for(表达式 1;表达式 2;表达式 3)语句
它的执行过程如下:
(1)先求表达式 1;
(2)求表达式2,若其值为真(值为非0),则执行for循环体中的语句,然后执行下面第三步,若为假(值为0),则结束循环,跳到第5步;
(3)求解表达式3;
(4)转回上面第(2)步骤继续执行;
(5)结束循环,执行for语句下面的一个语句。
因此只要for循环中表达式2(i+n)只要不为零就满足循环条件。
其它相关的变种题如下:
- 通过修改、增加一个字符,让其输出21个减号
- 通过修改、增加一个字符,让其只输出1个减号
- 通过修改、增加一个字符,让其不输出减号