1.1 算法篇-切面条

算法篇

1、切面条

一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。 
那么,连续对折10次,中间切一刀,会得到多少面条呢?
1.1 问题分析归纳

1、不对折(对折零次),从中间切一刀,得到 2 根面条, 2 = 1 + 20
2、对折一次,从中间切一刀,得到 3 根面条, 3 = 1 + 21
3、对折两次,从中间切一刀,得到 5 根面条, 5 = 1 + 22
4、对折三次,从中间切一刀,得到 9 根面条, 9 = 1 + 23

11、对折N次,从中间切一刀,得到 1 + 2n 根面条

因此, 连续对折10次,中间切一刀,会得到 1 + 210 = 1 + 45 = 1025 面条

1.2 证明

一根面条,中间切一刀,会变成两根面条,所以对于本题,可以有
定义1:
中间切一刀,会变成两根面条

将一根面条不对折,中间切一刀,会变成两根面条;如果将一根面条收尾相连变成一个环,切一刀,也是变成两根面条:也就是说二者的面条数相等。
既然二者产生的结果相同,所以可以将二者等效。
根据定义1,可以将一个环看成是一根面条,且从宏观上看,多次对折的面条变成的环也可以看成是一根面条。
又有将一根面条对折一次,中间切一刀,会变成三根面条,对于本题,可以有
定理1:
对折切的结果是产生一根新的面条,且面条数少一

N|n=0 = 2。根据定理1,N|n=1 = 2^1+1 = 3,N|n=2 = 2^2+1 = 5,…,N = 2^n+1。

为什么不是N = ((((21+1)2+1)3+1)…n+1)?
在正在对折的过程中,仍处在等效的状态当中,环未拆开即首位未断开,直到形成最终的一根面条中间切后将首尾断开才把少的面条数加上去。

1.3 题解代码
1.3.1 C++
#include <stdio.h>

int cut_noodles(int times) {
    int result = 2, t = 1;
    for (int i = 0; i < times; i++)
    {
        result += t;
        t = t * 2;
    }
    return result;
}

int main() {
    int result;
    int times = 0;
    result = cut_noodles(times);
    printf( "对折 %d 次从中间切一刀得到的面条数是: %d\n", times, result);
    return 0;
}
1.3.2 JAVA
public static void main(String[] args) {
        System.out.println("对折十次得到面条数量:"+count(10));
}

public static int count(int num){
    int sum=1;
    for (int i=0; i<num; i++){
        sum =sum*2;
    }
    return sum+1;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值