首页 >> 大全

7.17~7.23周记

2023-10-23 大全 28 作者:考证青年

这天主要就讲了一个结构体和递归函数

这边就主要放几个例题来回顾递归

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.存放并输出一般函数
#include
using 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]<<" ";}
}

像上述代码一样的 我们可以吧看成一个数组就行 怎么对待数组就怎么对待

像结构体一样的数组我们也可以用来运行

#include
using namespace std;struct stu {int num;string x;
};bool cmp(stu a,stu b) {return a.num < b.num;
}
int main() {vectorv;stu l;int h;string name;for (int i = 0; i < 3; i++) {cin >> name>>h;l.x = name;l.num = h;v.push_back(l);}sort(v.begin(), v.end(), cmp);for (auto it = v.begin(); it != v.end(); it++) {cout << (*it).x << (*it).num<

字符串也是可以的啦

3.存放并输出字符串类型数组
#include
using namespace std;int main() {vectorv;for (int i = 0; i < 3; i++) {string s;cin >> s;v.push_back(s);}for (int i = 0; i < 3; i++) {cout << v[i]<<" ";}
}

当时在看到输出能用coutv[i] 因为一开始是没有内存 所以必须用来给创造一个内存空间 后来想到用这个函数 先给赋值一个内存

具体代码如下:

#include
using namespace std;int main() {vectorv;int x;	cin >> x;v.resize(x);for (int i = 0; i < 3; i++) {cin >> v[i];}/*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]<<" ";}
}

还有一些赋值的方法比如()函数

有两种方法的赋值

1.(区间)

它输出的数据是这个区间里面的所有数

具体代码如下

_周记400字_7.17是什么日子

#include
using namespace std;int main() {vectorv1(10,100);vectorv2;v2.assign(v1.begin(), v1.end());for (int i = 0; i < 10; i++) {cout << v2[i]<<" ";}
}

2.(n,elem)

它给n个数字附上elem类型的数据(这个elem代表的是任意类型的数据的值)

具体代码如下

#include
using namespace std;int main() {vectorv2;v2.assign(10, 55);for (int i = 0; i < 10; i++) {cout << v2[i]<<" ";}
}

它其实跟一开始对v2赋值一样;

#include
using namespace std;int main() {vectorv2(10,55);for (int i = 0; i < 10; i++) {cout << v2[i]<<" ";}
}

对于有几个函数

v.begin() v数组的开头

v.end()v数组的结尾

v.()v的容量

v.size() v的大小

其中v的容量>=v的大小

v.(n)指定v的容量为n

如果变大 那么超出的部分就自动为0;如果变小 那么超出的部分就自己删除。

v.empty()返回值为bool类型 判断v数组是否为空;

v.(ele)在v函数的尾部插入元素ele

v.();删除最后一个元素

( pos,ele)//在pos的位置插入ele

#include
using namespace std;int main() {vectorv2(10,55);v2.insert(v2.begin() + 2, 100);for (int i = 0; i <=10; i++) {cout << v2[i]<<" ";}
}

在v2的第三位(开头后两位)插入数据100

( pos,n,ele)//在pos位置插入n个ele

#include
using namespace std;int main() {vectorv2(10,55);v2.insert(v2.begin() + 2,2, 100);for (int i = 0; i <=10; i++) {cout << v2[i]<<" ";}
}

erase是删除 也跟上述同理

例子:

#include
using namespace std;int main() {vectorv2(10,55);v2.insert(v2.begin() + 2,2, 100);for (int i = 0; i <=10; i++) {cout << v2[i]<<" ";}cout << endl;v2.erase(v2.begin(), v2.begin()+2);for (int i = 0; i <= 8; i++) {cout << v2[i] << " ";}
}

结果

55 55 100 100 55 55 55 55 55 55 55

100 100 55 55 55 55 55 55 55

cout

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了