一些零碎小知识点

常用头文件

1
2
3
4
5
6
7
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<bits/stdc++.h> //万能头文件

动态数组

1
2
3
4
#include <iostream>
#include <vector>

vector<int> a(n);

输入输出

1
2
3
cin>>n //输入n
cout<<a[i]<<endl //输出a[i]并换行
cout<<a[i]<<"\n" //输出a[i]并换行

指针定义二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
a = (int **)calloc(n,sizeof(int *)); //或(int **)malloc(n*sizeof(int *));
//calloc 会初始化为0 malloc不会
//(int **)强制类型转换 指向int型变量指针的指针
//sizeof(int *) int型指针占的字节数
for(int i=0;i<n;i++){
a[i]=(int *)calloc(n,sizeof(int));
} //定义n个int型变量指针

free(a);
for(int i=0;i<n;i++){
free(a[i]);
}
//释放内存

输入到文件末尾

1
2
3
while(scanf("%d",&a)!=EOF)
while(cin>>a)
//输入时 换行ctrl+z结束输入

ASCII表

1
2
大写字母 A-Z 对应的 ASCII 码是 65-90
小写字母 a-z 对应的 ASCII 码是 97-122

字符串处理

1
2
3
4
5
'\0' 空字符
scanf输入到空格即停止
gets会输入空格 输入到换行符停止(换行符也会被读入)
gets会把空格当' '保存 而scanf会把他当'\0'
sscanf ssprintf memset strlen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

//sscanf和sprintf函数
sscanf(s,"%d",&c); //字符串s -> 整数c
sprintf(s,"%d",&c); //整数c -> 字符串s

//memset
memset(s,0,sizeof(s));

//strlen s.length求字符串长度函数
//strlen要计算长度的字符串,直到以空字符\0结尾的字符
//s.length计算长度的字符串,可以计算空格

//getline整行输入 会计入空格符 但是cin>>s不会
string s;
getline(cin,s);

//a串+b串
//1 string
string s,s1;
s+=s1;
//2 字符数组
char s[100],s1[100]
strcat(s,s1); //等于上面的s+=s1

//s串复制到s1串
//1 string
string s,s1;
s=s1;
//2 字符数组
char s[100],s1[100]
strcpy(s1,s);

//子串
//string
string s;
s.substr(a,b); //从位置a起 b个字符
s.substr(a); //从位置a起至字符串末尾

//s找子串s1位置
//1 string
string s,s1;
s.find(s1) //若找到返回位置 若没找到返回一个很怪的值
s.find(s1,a) //从s的a位置找s1
if(s.find(s1)==string::npos) //没找到的判定条件
//2 字符数组
char s[100],s1[100];
strstr(s,s1) //若找到返回位置 没找到返回NULL

//s中插入s1,在第a个字符串前
//string
string s,s1;
s.insert (a,s1);

//将字符串中小写字母变大写 大写变小写
string s;
for(int i=0;i<s.length;i++){
s[i]=toupper(s[i]) //或 s[i]=tolower(s[i])
}

//统计字串出现次数
int cs(string s){
string s1="VK";
int c=0;
int b=s.find(s1);
while(s.find(s1,b)!=string::npos){
c++;
b=s.find(s1,b+1);
}
return c;
}

//strcmp 字符串比较函数 返回一个int
strcmp(str1,str2)
// 如果str1与str2相等,则返回值为0。
// 如果str1长度小于str2,则返回值小于0。
// 如果str1长度大于str2,则返回值大于0。

strcpy(str1,str2)
//把str2的内容赋值到str1里

strcat(str1,str2)
//把str2内容贴到str1末尾

to_string(int a)
//把整数a变成string型

质数判断

1
2
3
4
5
6
7
8
9
10
//大于1且只能被1和自身整除的数
//0 1 不是质数
//2 是质数
bool prime(int n){
if(n==1||n==0) return false;
for(int i=2;i*i<=n;i++){
if(n%i==0) return false;
}
return true;
}

switch语句举例

1
2
3
4
5
6
7
8
9
10
11
12
switch (month) {
case 12:
case 1:
case 2:
printf("冬季\n");
break;
case 3:
case 4:
case 5:
printf("春季\n");
break;
}

最大公因数

欧几里得算法,两个数相除,将余数作为新除数,直到除尽为止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//递归写法
int gcd(int a,int b){
if(b==0) {
return a;
}
else return gcd(b,a%b);
}

//不用递归
int gcd(int a,int b){
while(b!=0){
int temp=b;
b=a%b;
a=temp;
}
return a;
}

斐波那契

第1项 0 第2项 1 ,之后的每项都为前两项之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//递归写法
int f(int n){
if(n==1) return 0;
if(n==2) return 1;
else return f(n-1)+f(n-2);
}
//不用递归
int f(int n){
if(n==1) return 0;
if(n==2) return 1;
else {
int a=0,b=1;
for(int i=3;i<=n;i++){
int t=a+b;
a=b;
b=t;
}
return b;
}
}

闰年

1
2
//能被4整除但不能被100整除 但能被400整除也是闰年

1

高精度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string multiply(string num1,int num2){ //字符串表示高精度
string result = "";
int carry=0;
for(int i=num1.length()-1;i>=0;i--){ //字符串与一般数组的高低位是反着的
int product=(num1[i]-'0')*num2+carry;
result=to_string(product%10)+result;
carry=product/10;
}
while(carry>0){
result=to_string(carry%10)+result;
carry/=10;
}
return result;
} 字符串高精度乘法
sort(a+1,a+n+1); 排a[1]到a[n]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
```
### 汉诺塔
```c++
//递归写法
void digui(int n,char a,char b,char c){ //n个盘移动从a移动到c,通过b
if(n==1) {
cout<<a<<"-->"<<c<<endl;
}
else {
digui(n-1,a,c,b);//n-1个盘移动从a移动到b,通过c
cout<<a<<"-->"<<c<<endl;
digui(n-1,b,a,c);//n-1个盘移动从b移动到c,通过a
}
}
//迭代写法 用栈

整数划分(不是很懂)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<bits/stdc++.h>
using namespace std;
int digui(int n,int m){ //n为待划分的数 m为最大划分数
if(n==0||m==1) return 1; //n==0时return1 因为n=0时已经在计算有一个m的情况了
if(n>=m){
return digui(n,m-1)+digui(n-m,m);
//digui(n,m-1)是指 划分数中不包含m的情况
//digui(n-m,m)是指划分数中已经有一个m 在计算其他情况
//两者相加即为所得
}
else return digui(n,n);
}
int main(){
int n;
while(cin>>n){
cout<<digui(n,n)<<endl;
}
return 0;
}
auto current = circle.begin()
vector.begin()
vector.end()
push_back(value):将元素添加到vector的末尾。
pop_back():移除vector的最后一个元素。
size():返回vector中元素的个数。
empty():检查vector是否为空,如果为空返回true,否则返回false。
clear():清空vector中的所有元素。
resize(newSize):改变vector的大小,使其包含指定数量的元素。
front():返回vector的第一个元素。
back():返回vector的最后一个元素。
at(index):返回指定索引处的元素。
begin() 和 end():返回指向vector首元素和尾后元素的迭代器,用于遍历vector中的元素。
insert(iterator, value):在指定位置之前插入元素。
erase(iterator):移除指定位置的元素。
swap(vector2):交换两个vector容器的元素。
大整数乘法