【蓝桥杯题目分析】2014年第五届——第二题:
标题:切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
分析:
我能想到两种思考方式:
一、数学思维
每n次对折供产生2^n条横线,我们将面条抽象成直线,类似这样:
如果不考虑相连部分,切一刀后横线变成2倍,共得到:2×2n=2n+1段
现在我们来去掉相连的直线:
除了2个线头没有连接,剩下的都有连接,所以重复计算的线条为:(2n+1 -2)/2=2n-1
汇总得到的面条数:
2n+1-(2n-1)=2n+1
计算结果:
0次对折:2
1次对折:3
2次对折:5
3次对折:9
…
解题程序代码:
int main()
{
int result;
int times = 10;
result = 2^times;
printf( "对折 %d 次从中间切一刀得到的面条数是: %d\n", times, result);
return 0;
}
二、编程迭代思维
考虑每次对折变化的线条数于上一次的关系,即增量思维。具体如下图:
n次对折的1、2部分与(n-1)次对折的1、2部分抵消,也就是(n-1)次对折的面条数。
n次对折的第3部分面条数,(n-1)次对折横线数的一半:2(n-2)
n次对折的第4部分面条数,(n-1)次对折横线数的一半:2(n-2)
假设计算条数的函数为f(n),其中n为对折次数:
f(0)=2
f(1)=3
f(2)=5
…
f(n)=f(n-1)+2(n-2)+2(n-2)=f(n-1)+2(n-1)
解题程序代码:
int cut_noodles(int times)
{
int result = 0;
if times=0:
cut_noodles(times)=2;
else :
result=cut_noodles(times-1)+2^(times-1)
return result;
}
int main()
{
int result;
int times = 10;
result = cut_noodles(times);
printf( "对折 %d 次从中间切一刀得到的面条数是: %d\n", times, result);
return 0;
}