算法(一)-切面条

【蓝桥杯题目分析】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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值