1.入门知识
1. int 类型的大致范围在-2 x ~ 2 x
, long long的类型在-9 x
~ 9 x
之间,float实际精度6~7位,double精度15~16位
2. 0~9、A~Z、a~z ASCII码分别为48~57、65~90、97~122。空格ASCII码为32
3. true输出为1,强制类型转换为(新类型名)变量名
4. 除了%c外,scanf对格式符(%d)的输入是以空白符为结束判断标志的。字符串%s读入以空格和换行符为读入结束的标志。
数据类型 | 格式符 |
int | %d |
long long | %lld |
float | %f |
double | %lf(读入)、%f(输出) |
char | %c |
字符串 | %s |
(1)%md
%md可以让不足m位的int型变量以m位进行右对齐输出,高位用空格补齐,若本身超过m位,则保持原样
(2) %0md
变量不足m位的时候用0补齐
(3)%.mf
让浮点数保留m位小数输出,保留的规则是四舍五入成双规则
5. 常用math函数
(1) fabs(double) :取绝对值函数
(2) floor(double) 、ceil(double):向下取整和向上取整
(3) pow(double r, double p) :
(4) sqrt(double x) :返回x的算数平方根
(5) log(double x) : 返回double型变量的以自然对数为底的对数
(6)sin(double)、cos(double)、tan(double)、asin(double)、acos(double)、atan(double)
(7) round(double x): 四舍五入
6.冒泡排序
void BubbleSort(int arrs[], int n){
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n - i; j ++) {
if (a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = a[j];
}
}
}
}
7. 如果数组大小较大,级别,则需要将其定义在主函数外面,否则会使程序异常退出。原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小。而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。
#include<stdio.h>
int a[1000000]
int main(){
}
8.memset——对数组中每个元素赋相同的值
memset(数组名,值,sizeof(数组名)):建议用memset函数赋0或者-1,如果赋其他值用fill函数。
9. gets输入,puts输出
gets用来输入一行字符串(识别\n作为输入结束),puts输出一行字符串,并紧跟一个换行,.
char str[20];
gets(str);
特别提醒:如果不是使用scanf函数的%s格式或者gets函数输入字符串,请一定在输入的每个字符串后面加入\0。否则printf和puts输出字符串会因为无法识别字符串末尾而输出一堆乱码。
10. string.h头文件
strlen(字符数组): 得到字符数组组中第一个\0前的字符的个数
strcmp(字符数组1,字符数组2):返回来个字符串大小的比较结果,按照字典顺序。
strcpy(字符数组1,字符数组2):将字符数组2复制给字符数组1(包括了结束符\0)
strcat(字符数组1,字符数组2):把一个字符串接到另一个字符串后面。
11.sscanf 和 sprintf
12.结构体
如果自己重新定义了构造函数,则不能不经初始化就定义结构体变量。需要自己手动加上无参数构造器。
13. cin 和cout
想读入一整行,可以使用getline函数
#include<iomanip>
char str[100];
cin.getline(str, 100);
cout << setiosflags(ios::fixed) << setprecision(2) << 123.4567 <<endl;
//输出123.45
14. 浮点数比较
#include<math.h>
const double eps = 1e-8;
#define Equ(a,b) ((fabs((a) - (b))) < (eps)) // ==
#define More(a,b) (((a) - (b)) > (eps)) // > 和 >=
#define Less(a,b) (((a) - (b)) < (-eps)) // < 和 <=
圆周率 π = acos(-1.0)
2.语法篇
2.1 函数库
cstdio
- char * fgets ( char * str, int num, FILE * stream ) 读取一行输入
stdlib
- double atof(const char *str) 把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。
- int atoi(const char *str)把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
- long int atol(const char *str)把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。
climits
包含INT_MAX、INT_MIN等
cstring
- int sscanf(const char *str, const char *format, …) 从字符串读取格式化输入。
- int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串
algorithm
- sort函数:
- sort(<type>* begin, <type>* end, bool cmp)
- sort(iterator begin, iterator end, bool cmp)
- copy(<#_InputIterator __first#>, _InputIterator __last, <#_OutputIterator __result#>) 用于复制数组或者可迭代容器。三个参数分别是源的起始迭代器,源的结束迭代器,副本的起始迭代器。
- memset(<T> * first, <T> value, int sizeOf)
- fill(G[0], G[0] + MAX_N * MAX_N, false); 这是一个二维数组的例子,要注意。
- template ForwardIterator max_element (ForwardIterator first, ForwardIterator last); 返回stl中的最大的元素,返回的是一个指针
functional
- greater()等,用于排序的时候从大到小排序。
2.2 常用数据结构
遍历
除了map,大部分可以使用forEach语法。如果使用迭代器语法则类似下面这样。
for(auto lt: stl.begin(); lt != stl.cend(); lt++){
//lt->......
}
如果是map,一般是这样:
for(auto lt: stl.begin(); lt != stl.cend(); lt++){
//lt->first表示key
//lt->value表示value
}
逆向遍历
for(auto lt = n.rbegin(); lt != n.rend(); lt++){
//......
}
通用操作
- erase(iterator pos) 擦除指定位置的元素
- erase(iterator begin, iterator end) 擦除指定范围内的元素,左开右闭
- iterator find(value) 查找元素,只能在vector、set、map等容器中使用
string操作
有些输入比较大的题目,在函数调用中,如果string不会被改动,最好使用引用(&),以减少内存的复制。当然,不正确地使用引用会出现问题。
- to_string(double, int, …) 将基本类型转化为字符串
- reverse(.begin(), s.end()) 反转字符串
- string substr(int startPos, int Len) 求字符串子串
- char* c_str() 返回原始字符数组
- getline(cin, string str) 用于读取一行数据
- insert(iterator pos, char c) 插入一个字符
部分参考https://blog.csdn.net/a617976080/article/details/89676670