1.printf与scanf效率比cout&cin高
2.int 范围为32位有符号数,一般可以看做10^9内的数。超过这个范围的多用long long(对应%lld)类型。更大的话使用结构体模拟大数据存储。
3.浮点数一般用double(输出时对应%lf,输入时%f),毕竟精度高,也没啥大影响。
4.int/int时,不会自动转换为浮点型,结果还是int,除非强制类型转换
eg:
int a = 1;
int b = 2;
double c = (double)a / (double)b;
5.char 类型使用ASCII编码,因此要将‘0’转换为对应整数值时,可以使用char - '0'
6.时常会出现要求格式输出的问题,%.mf:保留m位小数输出;%md右对齐输出,不足的用空格补齐;%0md不足的用0补齐;%-md左对齐输出。
7.#define定义的常量在使用时,是当做整体嵌入到使用的位置,因此很可能会出现代替后的语义与自己想实现的不同,可以多用括号分割,保证语义。
8.关于字符/字符串的读写
(1)scanf:处理字符串时,类似读单词,会在空格换行等符号前停止。(返回读取数据的个数)
printf:处理字符串时,一直到遇到“\0”时停止输出
(2)gets:读取一行,并将最后的换行符丢弃(读到文件尾或者出错时返回NULL)
puts:输出一行,并在最后补上换行符。遇\0停止输出。
gets不检查预留的存储空间是否足够,可能会溢出到相邻的内存区,同时gets与puts不安全,建议少用。
(3)fgets:处理文件,会一视同仁处理所有字符,能限定读取数。使用stdin 从键盘读取。
fputs:不自动添加换行符,内容完全输出到文件中,使用stdout,输出到屏幕上。
(4)getchar()/putchar():读取/输出任意字符。
9.常用的数学函数(头文件math.h)
fabs(),取绝对值,参数可以是浮点数,而abs()参数只能是整数,局限就比较大了。
floor(double)&ceil(double)
pow(double r,double p) 求r^q
sqrt()、log()、round()(四舍五入)
·············································································
10.超级超级重要的点:在写递归或者迭代的时候,一定要注意何时进入下一次递归/迭代,遍历所有情况;以及在什么情况下跳出,防止死循环。
··············································································
11.申请数组的大小超过10^6级别,均定义在全局变量的地方,函数内部分配的空间并不是很大。
12.当循环次数过大时会出现堆栈溢出的异常。对于O(n^2)的算法,n应该小于1000。
13.memset()初始化整形数组时只能处理0或-1,因为对应的二进制数分别为全0或全1.
14.字符串数组最后一位为‘/0’,因此在申请数组空间的时候,多申请一位。
15.常用的字符串处理函数:
1.strlen(char*);//字符数组长度,直到第一个'/0',是可能超过数组长度的。
2.strcmp(char* str1, char* str2);//按字典序比较两个字符串的大小,返回0则表示相等。
strncmp(char* str1, char* str2, int n);//比较前n个字符
3.strcpy(char* str1, char* str2);//将字符串str2复制给str1(最后会有'\0')
//会把str1原有的内容覆盖掉。并且不考虑str1数组是否能容纳
strncpy(char* str1, char* str2, int n);//按指定长度复制
4.strcat(char* str1, char* str2);//将str2拼接到str1之后,不考虑str1长度是否足够。
strncat(char* str1, char* str2, int n);//拼接指定长度
5.sscanf(str, "%d", &n);//将str写入n中
ssprintf(str, "%d", n);//将n写入str中
eg:
str = "2048:3.14,hello";
sscanf(str, "%d:%f,%s",&d,&f,&s);//d=2048;f=3.14;s=hello;
ssprintf(str, "%d:%f,%s",&d,&f,&);//str="2048:3.14,hello";
16.函数参数:分清局部变量与全部变量;参数是否是引用。尤其是当形参是指针的引用时,在函数内部可能修改的是实参指向的地址,而不仅仅是实参指向的地址的内容;多维数组作为参数时,仅第一维数组可以不用指明大小,eg:func(int a[][5]);
17.分清指针与指针指向的地址,指针指向地址的内容。
18.引用实际上是变量的别名,因此将引用作为参数时,实际传的是本身而不是副本;并且常量是不能拥有别名的。
19.浮点数进行运算过后出现的精度问题:引入极小值eps=10^-8.实际值与理想值偏差在eps的范围内便可以认为相等。当然还有对于大于小于等其他判断,按照同样方式设定与eps的关系即可。
20.
21.结构体的使用
struct s{
int a;
char b;
s(){}
s(int _a, int _b){a = _a; b = _b;}
}pt[10];//注意此处有分号
int main(){
pt[0] = s(1, 'a');
s S;//此时a,b没有初始化
}
22.cin.getline(char*str, int len)//读取一整行数据
23.while(scanf()!=EOF){}
24.日期处理,可以先用数组存储平年和闰年的月份及对应天数,处理日期变化时,直接对应数组中的数据,判断是否需要变换。
25.进制转换处理,记住进制转换公式即可。
26.sort()的使用(c++ 的函数,头文件algorithm,using namespace std)
sort(首地址,尾元素的下一个地址,比较函数(有默认值)),不写比较函数,默认增序排序
int a[6] = {2,1,3,5,4,6};
sort(a,a+6,cmp);//cmp实现增序排列
ans:1,2,3,4,5,6
比较函数cmp(),用于sort判断何时应该交换顺序:
bool cmp(int a, int b){
return a>b;
}//a>b时,a放在b前面
容器使用sort()函数:只能用于vector,string,deque
vector<int> a;
sort(a.begin(), a.end(), cmp);//使用迭代器
bool cmp(int a, int b);//参数为容器中存储元素的类型
27.缩小重复计算,类似于求幂级数时,会出现大量的重复的计算值,此时可以通过一个数组保存这些中间值,每次使用时取出就行。