算法篇
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;
}