7.17~7.23周记

这天主要就讲了一个结构体和递归函数
这边就主要放几个例题来回顾递归
1.输入非负整数m和n,输出组合数 其中m≤n≤20;
这个是一个很经典的递归题目 根本思想是 C(n-1,m-1)*m/n=c(n,m); 当然如果出现像C(4,6)这种情况的数字 我们要把它转化为C(2,6)然后进行递归 。
代码详解:
#include double Cmb(int x, int y);int main(){int m, n;scanf("%d%d", &m, &n);printf("%.10g\n", Cmb(m, n));return 0;}double Cmb(int x, int y) {//主要的递归部分 。if (x == y) {return 1;}else if (y == 0) {return 1;}else if (y == 1) {return x;}else if (y > x / 2) {//转化y = x - y;return Cmb(x, y);}else {return Cmb(x - 1, y - 1) * x / y;}}
2.辗转相除法之最大公约数的求解
代码详解:
Bool check(int a, int b){Int r;if(abwhile(b!=0){r=a%b;a=b;b=r;}//辗转相除法
最后出来的a就为最大公约数
3.切面条
一根高筋拉面,中间切一刀,可以得到2根面条 。
如果先对折1次,中间切一刀,可以得到3根面条 。
如果连续对折2次,中间切一刀,可以得到5根面条 。
那么,连续对折10次,中间切一刀,会得到多少面条呢?
解析:由于对折次数仅为10,数据规模并不大,可以通过手算简单的完成 。
对折0次,得到2根;
对折1次,得到2 * 2 - 1 = 3
对折2次,得到3 * 2 - 1 = 5
对折3次,得到5 * 2 - 1 = 9
对折4次,得到9 * 2 - 1 = 17
对折5次,得到17 * 2 - 1 = 33
对折6次,得到33 * 2 - 1 = 65
对折7次,得到65 * 2 - 1 = 129
对折8次,得到129 * 2 - 1 = 257
对折9次,得到257 * 2 - 1 = 513
对折10次,得到513 * 2 - 1 = 1025
代码详解
4.车队
X星球特别讲究秩序,所有道路都是单行线 。
一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行 。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示 。
X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查 。
如果车辆进入检查站和离开的次序可以任意交错 。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车 。
显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种 。
代码详解
#include int f(int n,int m) {if(n==0) //如果左边没有车返回1return 1;if(m==0) //如果检车站没车就入栈return f(n-1,1);if(m>0)//如果检车站有车//分两种情况,车辆入站和出站return f(n-1,m+1)+f(n,m-1);return 0;}int main() {printf("%d",f(16,0));return 0;}
第一天的内容还是相对比较简单的 随着第二天的stl的涉及我发现我的脑子逐渐开始不够用了......
(一)容器
对于容器我是这么理解的 他可以当成一个随意可以变化大小内存的数组 他不像我们之前学的数组要提前给他一个比如说a[1000]的内存 它是你给他存多少它就有多少
1.存放并输出一般的函数
1.存放并输出一般函数#includeusing namespace std;int main() {vectorv;int x;for (int i = 0; i < 3; i++) {cin >> x;v.push_back(x);}/*for (auto it = v.begin(); it != v.end(); it++) {cout << *it << endl;}*/sort(v.begin(), v.end());for (int i = 0; i < 3; i++) {cout << v[i]<<" ";}}
像上述代码一样的 我们可以吧看成一个数组就行 怎么对待数组就怎么对待
像结构体一样的数组我们也可以用来运行