至多修改一个字符,使得for循环内部执行 20 次。
int n = 20;
for (int i = 0; i < n; i--)
{
cout << "-"; // 要求这里的打印执行20次
}
1.将for循环的第三个参数的 i--
修改为 n--
。
int cnt = 0;
int n = 20;
for (int i = 0; i < n; n--)
{
cout << ++cnt << " "; // 这里用cnt打印,便于观察
}
2.将for循环的第二个参数 i < n
修改为 i < -n
。
int cnt = 0;
int n = 20;
for (int i = 0; -i < n; i--)
{
cout << ++cnt << " "; // 要求这里的打印执行20次
}
3.将for循环的第二个参数 i < n
修改为 i + n
。
int cnt = 0;
int n = 20;
for (int i = 0; i + n; i--)
{
cout << ++cnt << " "; // 要求这里的打印执行20次
}
分析:
对于原程序来说,int n = 20; for (int i = 0; i < n; i--);
- i 从 0一直递减,==> 0,-1,-2,-3,-4,-5,-6,-7,-8,-9,…
- 可修改的地方有4处,即 n 的初始值,i 的初始值, 终止条件, 和每次循环时的改变条件。
- 从 n 值入手,无法实现目的。当我们把 n 设置成 -20 时,i 的初值为 0, 无法进入循环。
- 从 i 的初始值入手, 同上,我们无法实现目的
- 终止条件:我们可以看到 i 是自 0,-1,-2,-3,-4,-5,… ,而 n = 20 ,我们希望的结果是 i < 20 。那么如果将比较的语句编程
-i < n
则,可实现1 < 20?
、2 < 20?
、 …20 < 20
- 终止条件:按上述条件分析,我们还可以这样。 将
i + n
的结果当做终止条件,这样在 i = -20 时,终止条件变成了 -20+20=0 - 既然前几项都无法改变,那么我们尝试修改最后一个条件,如果将 i 保持恒定值为 0, 将 n 的值每次减少一次,那么 n 在二十次循环后自然就减少到与 i 相同,等于 0 。
除此之外,我们还可以思考 取反运算,0 “~”取反运算后是 -1
,-1 “~”取反运算后是 0
,-2 “~”取反运算后是 1
, -3 “~”取反运算后是 2
… -21 “~”取反运算后是 20
。因此,如果代码这样改,将会输出 21 次结果。
int cnt = 0;
int n = 20;
for (int i = 0; ~i < n; i--)
{
cout << ++cnt << " "; // 要求这里的打印执行20次
}