报错:
fatal error: bits/stdc++.h: No such file or directory|
原因:将c++误建成c文件
审题篇:
注意非负,非正,负数…
输入
- 注意输入的格式,要在scanf()中吸收多余的字符:如
12:20
中的:
TIPS
- C中自带的常量:
INT_MAX, INT_MIN
LONG_MAX, LONG_MIN
FLT_MAX, FLT_MIN
DBL_MIN, DBL_MAX
包含在头文件climits中
【注】要将min设为INT_MAX(无穷大), max设为INT_MIN(无穷小) !!注意别搞反了!!
algorithm
中的min_element(first, last, cmp)
和max_element(first, last, cmp)
1)这两个函数都可以返回一个数组(或vector)中最大最小值的迭代器it,通过*it 就可以找到相应的元素,it - begin()即再数组中的位置
2)最后一个参数可以是函数指针,也可以是函数对象,定义<的意义(比较规则),可省略(即按照默认:1<2)
-
记得测试边界数据:1, 230 = 1073741824 = (int)pow(2.0, 30.0);
-
int占32位的时候,最大可以赋值为:2147483647。也就是0x7fffffff (0,1111…1111)
-
断素数:使用sqrt函数会慢一些,不如在for循环里直接
i*i<n
TIPS 1:sprintf(digit, “%d”, sum): 将数字sum按位,以"%d"格式,写进char型数组digit的
- TIPS 1: substr()用法
1.substr(str, start, len)
或 str.substr(start, len)
:从str的start位置开始提取字符串
2.len:要提取字符串的长度,若length为以下任意条件之一时,返回start位置到串尾的所有字符:
1)不指定 | 2)为空 | 3)负数 | 4)大于start到串尾的长度
- TIPS 2: stoi()用法
1.头文件#include<cstring>
2.stoi(const string*)
传入一个string,返回对应的int
3.要包含c++11:在编译器设置里添加-std=c++11
- TIPS 3: erase()用法
string& erase ( size_t pos = 0, size_t n = npos );
1.使用迭代器
1)s.erase(it); //删除it
2) s.erase(fiest, last); //删除[first, last)
2.使用位置
s.erase(pos, n) //从pos开始删除n个元素
-
TIPS 1:
sscanf(str, "%lf", &tmp);
:将str以浮点数形式写入tmp,若格式不符,不写入 -
TIPS 2:
sprintf(str, "%.2f", tmp);
:将tmp(浮点数形式)以.2f格式写入str,若tmp与.2f格式不匹配:如char tmp[]:输出0.00,但换成"%d"就输出 7405072不知道什么原理
这两个函数都只对char 数组有效:string要转化为char数组,即:str.c_str()
短路原理:
TIPS 1:
C语言中:||或运算符,只判断前半部分是否为true,若前半部分为true,就不继续看后面了
可以用%*c
吸收一个字符,代替getchar(), 如scanf("%*c%c", &c);
TIPS 1: 关于scanf() != EOF
scanf()的返回值为:输入值的个数,若没有输入返回-1(EOF == -1)
~: 按位取反,-1取反为0 --> 可以通过while(~scanf())来判断是否输入完
WRONG
-
多层循环:千万别把i, j 写错!!找瞎你!!
-
别忘了N!!!
每次都被这个N骗了,注意输入为序列时,第一个是N(数组长度),不是第一个元素!!
eg.
3 2 3 1 //3是输入的个数,不是一个输入!!!
PAT 1002: 多项式加法
别忘了相加后系数为0的项, 同时控制输出格式是,最后一项的位置是不确定的(不一定是0)
PAT 10
- 若在循环里直接输出天数,别忘了最后一天也要处理,这里采用哨兵mile[n+1] = 0;,将最后一天平凡化处理
否则须在循环外处理前n天都符合爱丁顿数的情况
Wrong:
第一次写的时候采用的是string存储,通过reverse函数判断是否回文,这样是不行的,因为n在b进制下每位可能>10,即不是一个单char
即:"12" - '0' != 12
//样例2:long long 过 10^72917超int范围
bool isPrime():注意for中i从2开始到sqr结束!!!
- Wrong 1:size()返回的是无符号数,s.size()-k可能溢出成很大的数 ,可能导致无限循环!
- Wrong 1:
判断素数不要忘记1和0的情况,不属于素数
由于输入范围是10^10超int 范围,只能用string 存储运算(模拟整数运算),切记:中途也不能用int临时存某个变量
大整数加法:!!!for(int i = a.size()-1; i >= 0; --i){ //!!!:Wrong 1:要从后往前来
模拟分数的四则运算
- TIPS 1:要注意乘法的过程中可能会溢出 -> 要使用long long 存储分子分母
Wrong: 字符串题:getline() 出问题可能是没吸收\n
( getchar() )!! 这里要注意的是:上一次输入n时,会多出一个\n,要用一个getchar()或者cin.ignore()吸收掉,不然会影响下面getline()的读入
Wrong: a % 0会发生浮点数异常 Float Point Exception
PAT A1071 不能一个词一个词输入,因为can,can有两个word,但输入为一个str: separated by non-alphanumerical characters
PAT A1069
- 坑点:
Wrong 1:输入n (0, 104) 可能不足4位
Wrong 2: 输入6174要计算一次,所以要do_whilewhile(s != "0000" && s != "6174");
或者if_break
PAT A1149 break; //!!!:Wrong 1:不能提前break;后面还有数据要输入
PAT A1079 // Wrong 1: 脑抽开始写成 1.01 * r ( != 0.01 * r + 1)
TIPS 1:[Error] invalid types 'int[int]' for array subscript
与全局变量重名
vector child[maxn]
…
int child = child[now][i];
//多层循环输入数组时,下标别写错了! //!!!:Wrong 1: 里层循环j写成j!
AVL初始化时要初始化height
AVL:注意事项
Wrong 1:
一个节点的树的高度初始为1
Wrong 2:
getHeight()别忘了r==NULL的情况,空树高度0
Wrong 3:
左旋右旋操作后,更新r和tmp高度的顺序不能颠倒,要先更新下面的,再更新上面的(因为更新前r和tmp还没交换,所有tmp在上,先更新r)
Wrong 4:
注意返回值类型,如这里插入和L/R都是通过在传入参数node* &root直接修改,故返回值为viod:直接r上操作,不需要返回root了
Wrong 5:
插入里的左右判断,如果直接把左的情况复制粘贴到右的情况,千万不要忘记改rc/lc
error: invalid types 'int[int]' for array subscript
局部变量与全局变量重名:dijkstra中的int d 与全局d[]重名!
!!如果for里有输入,千万别提前break出for,否则数据输入不完!!!
48 43 C:\Users\fjjnbb\Desktop\asdads.cpp [Error] cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string}’ through ‘…’ :
printf("%s ", string);
注意区分正还是非负!!!
图题节点分成2个阵营时,要考虑路径上是否能经过不同阵营!