蓝桥杯基础-1.1切面条问题【分析解答】

蓝桥杯基础

1.1切面条


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


思考

三种模式

  1. 想过程

一根面条直接切是两根;对折一次再切变成了三根【这个过程中是多了一个弯】;对折两次再切变成了五根【这个过程是在保留前一次对折,即第一次对折的一个弯的同时,第二次对折给第一次对折产生的两层分别多加了一个弯】;再后续每一次都是在迭代【都是在保留前一次对折出现的弯的基础上,新一次对折又给前一次对折增加了前一次对折的层数那么多弯】

而每个弯,都是在切的时候“躲开”的部分,也就是每个弯都使最后的条数减一,而若是对折n次,那么弯的数目应该就是2^0+2^1+···+2^(n-1)这么多

那最后是在什么的基础上去做这个减法呢?就是别管弯去切的基础上,即对折一次应该是两层,这时候就先当每层切开是两段,共计2×2四段;对折两次就是4×2八段;后面的也是一样的,首先算层数,显然是2^n,n为对折的次数,再×2即2^(n+1)

再去做减法,用③的结果把上述②中讨论的减掉。即2^(n+1)-[2^0+2^1+···+2^(n-1)]

使用等比数列求和整理可以得到结果2^(n+1)-(2^n-1)=2^n+1

  1. 摊开来看

①将折叠之后的绳子每个折痕做标记再摊开来看,最后再去想切的过程。会发现什么呢?

②首先折痕的特殊性在于它们将整条绳子划分成了诸多小段,切的时候其实是对这每一个小段都切一刀,但是折痕处会将切后的两部分(自己切的一段和隔壁邻居切的相邻的那段)连接起来。

③折痕将切之前的绳子分成的段数,这很好想,其实就是2^n,折痕数目也呼之欲出了2^n-1;切一刀本应该变成2^(n+1),但是每一个折痕都将切后的有两段连起来,连起来的段数其实就是折痕的数目2^n-1,于是2^(n+1)-[2^n-1]得到最终结果2^n+1

  1. 多折几次根据结果归纳找规律

对折的次数

0

1

2

3

4

···

10

···

条数

2

3

5

9

17

···

···

找到规律2^n+1

代码实战

  • 直接套用结论

/*直接套用总结的结论*/
#include
#include

int main(){
	int n,answer;
	printf("请输入对折的次数:\n");
	scanf("%d",&n);
	answer=pow(2,n)+1;
	printf("切一刀之后得到的条数为:%d",answer);
	return 0;
}
  • 使用递归的思想

answer[i]=2×answer[i-1]-1;从何而来?

依旧是找规律,参考上面表格

根据公式

answer[i]=2^i+1;

answer[i-1]=2^(i-1)+1;

很明显可以知道,answer[i]=2×answer[i-1]+1

/*使用递归*/
#include

int main(){
	int n,answer[20];
	printf("请输入对折的次数:\n");
	scanf("%d",&n);
	answer[0]=2;
	for(int i=1;i<=n;i++){
		answer[i]=2*answer[i-1]-1;
	}
	printf("切一刀之后得到的条数为:%d",answer[n]);
	return 0;
}

你可能感兴趣的:(蓝桥杯历届真题,蓝桥杯)