打oj题c++笔记

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.缩小重复计算,类似于求幂级数时,会出现大量的重复的计算值,此时可以通过一个数组保存这些中间值,每次使用时取出就行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值