ranerr

导航

算法笔记——第二章 C/C++入门 学习笔记

  1. 虽然C/C++可以使用不指定格式的cin和cout,但cin和cout消耗的时间比scanf和2. printf多得多。而且,不要在同一个程序中同时使用cout和printf,有时候会出问题。

  2. 头文件最好写作:#include<cstdio>/<cmath>/<cstring>

  3. C++变量名字符只能是数字、字母或下划线,而每一个字符不能是数字,区分大小写。

  4. 绝对值在10^9以下的整数都可以定义成int,对于超过2147483647的整数,用long long来存储,而且要在大于231-1的数值后加上LL。总之,若要求109内或32位整数,就用int,如果是10^18以内或64位整数,就用long long

  5. float的精度有67位,double有1516位,都用%f输出(读入double要用%lf),但一般浮点型数据都用double

  6. ACSII码可以直接以整数形式赋值给char,小写字母的ASCII比大写字母的大32,\n代表换行,\0是空字符

  7. 宏定义除了可以定义常量外,还可以定义任何语句或片段,但宏定义的本质是“替换”所以要记得给定义中的各种成份加上括号

  8. 位运算符的优先级没有算术运算符高。由于int的上限是231-1,因此有时无穷大数的INF可以设置为(1<<31)-1,但一般更常用230-1,因为它可以避免相加超过int。2^30-1写在二进制形式是0x3fffffff

    const int INF = (1 <<30) - 1;
    const int INF = 0x3fffffff;
    
  9. n+=3、x/=(y+1)这类语句可以加快编译速度

  10. scanf读入数据时一定要记得写取地址运算符&,但在读入字符数组时,由于数组名即是地址,所以不必写&。

  11. scanf是以空白符即空格、TAB、换行作为其他格式字符的结束标志的,因此除非使用%c读入空格,其他情况都会将空格自动跳过,字符数组在使用%s读入时,以空格和换行作为读入结束的标志。

  12. printf三种实用的输出模式:

    • %md:可以使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐
    • %0md:将用0代替空格补齐
    • %.mf:可以让浮点数保留m位小数输出,依据“四舍六入五成双”
  13. typedef可以给复杂的数据类型起一个别名,这样使用中就可以用别名来代替复杂的写法

  14. 常用的math函数:

    • fabs(double x):用于取绝对值
    • floor(double x)和ceil(double x):用于向上和向下取整(注意向上和向下指的是相对数轴,所以ceil(-5.1)=-5)
    • pow(double r,double p):用于返回r^p
    • sqrt(double x):用于返回算术平方根
    • log(double x):用于返回ln(x)
    • sin(double x)、cos(double x)和tan(double x):三角函数,参数要求是弧度制,一般把pi的精确值定义为acos(-1.0)
    • asin(double x)、acos(double x)和atan(double x):反三角函数,返回值中的pi会直接乘进去
    • round(double x):用于将double型变量四舍五入,返回类型也是double,需要用(int)进行取整
  15. 判断表达式若为“!=0”或“==0”可以用“if(n)”和“if(!n)”来代替

  16. 数组大小必须是整数常量而不能是变量,如果数组较大(10^6级别),则需要定义在主函数外面,否则会使程序异常退出。因为局部变量来自系统栈,允许空间较小,而全局变量来自静态存储区,允许空间较大。

  17. memset(数组名,值,sizeof(数组名)):利用memset可以为数组赋相同的值,但一般只用来赋0和-1

  18. 字符数组也可以用字符串初始化,但仅限于初始化

  19. 由于字符数组要存储结束符“\0”,所以数组长度最少要比实际长度多1,手打字符数组还要手动加上“\0”,而通过scanf和gets输入的则会自动加上“\0”

  20. 常用的string函数:

    • strlen(字符数组):可以得到字符数组中第一个\0之前的字符个数
    • strcmp(字符数组1,字符数组2):按字典序比较字符串,若1<2则返回一个负整数,相等返回0,1>2则返回正整数
    • strcpy(字符数组1,字符数组2):将2复制给1
    • strcat(字符数组1,字符数组2):将2接在1后面
  21. sscanf(str,"%d",&n)和sprintf(str,"%d",n)可以用来以字符数组为对象读取或输出数据

  22. 指针的“*”其实是类型定义的一部分,两个指针相减,返回值为两者相差几个基类型的距离

  23. 想要在函数中修改参数的值还可以使用引用“&”

  24. 一个简化的结构体构造函数:

    studentInfo(int _id, char _gender): id(_id), gender(_gender) {}
    
  25. 浮点数的比较一般通过eps来控制误差,eps一般取10^-8,一些相关操作的宏定义如下:

    const double eps = 1e-8;
    const double Pi = acos(-1.0);
    #define Equ(a,b) ((fabs((a)-(b)))<(eps))
    #define More(a,b) (((a)-(b))>(eps))
    #define Less(a,b) (((a)-(b))<(-eps))
    #define MoreEqu(a,b) (((a)-(b))>(-eps))
    #define LessEqu(a,b) (((a)-(b))<(eps))
    
  26. OJ每秒可以承受的运算次数大概是107~108

posted on 2017-02-21 17:17  ranerr  阅读(127)  评论(0编辑  收藏  举报