[算法竞赛入门经典(第2版)读书笔记] ,第一章

1 篇文章 0 订阅
0 篇文章 0 订阅

本文是C和C++一些小tips,一部分(比如1)是语言的重要细节,这部分可以快速的浏览,对自己的知识查漏补缺;而另一部分(2-6)则是一些编程技巧,这些技巧似乎并不是那么实用,但是却相当有趣,各位看官在时间充裕的情况下可以自己思考一下实现的方法,如对笔者的方法有疑问,或者有更好的方法,欢迎大家提出和交流。

  1. printf(“%%”)可以用来输出%

  2. 变量交换(交换a和b中的值)

    1. 经典三变量

      t = a;
      a = b; 
      b = t;
    2. 不借助额外变量的方法

      //法1
      a = a + b;   //运行结束后:a:a+b, b:b
      b = a - b;   //a:a+b, b:a
      a = a - b;   //a:b, b:a 
      
      //法2,^为异或
      a = a ^ b;
      b = a ^ b;
      a = a ^ b;
  3. int的范围问题

     int i = 0;
     while (i < i + 1) i++;

    当while结束后i就是int的最大值,i+1就是int的最小值

  4. double的精度问题

    double x = 0.1;
    for (int i = 0; i < 30; i++, x *= 0.1)
        printf("%.30lf\n", x);

    在VS2013 中通过观察可以知道double的精度最多为16位(有效数字)
    这里写图片描述
    通过查资料可知double的精度为15-16位,能保证有15位
    float的精度为6-7位,能保证有6位

  5. double范围问题

    //如果观察不出结果,y可以设置得更大
    int y = 1030;
    //double的精度为15-16位,为了让double足够大,应尽量取高精度,因为笔者的编译器在取17个9的时候x变为了1.00000000000....所以这里取16位
    for (double x = 0.9999999999999999; y--; x *= 2) 
        printf("%.16e\n", x);
    y = 1030;       
    for (double x = -0.9999999999999999; y--; x *= 2)
        printf("%.16e\n", x);

    生成可执行文件后,命令行启动,输出重定向到文本中((假设名为POJ.exe)
    这里写图片描述
    观察输出
    Line 1023-1030
    这里写图片描述
    Line 2053- 2060
    这里写图片描述
    可以得到double能表示的最大整数和最小整数(非精确)分别为:
    1.7976931348623157e+308和-1.7976931348623157e+308
    又查资料可知在(WIN8-VS2013)c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\float.h 中可以得到关于double的更多信息:
    这里写图片描述
    宏DBL_MAX即为double能表示的最大值,除了最后一个数字,其他与实验得到的数据均相同,但这是可以理解和接受的,因为double的精度只有15-16位,而这里的最后一位,已经是第17位有效数字

  6. &&与||的优先级

    cout << (false && false || true) << endl;
    cout << (true || false && false) << endl;
    cout << ((true || false) && false) << endl;
    

    这里写图片描述
    由以上实验和资料(The C Programming Language)可知&&优先级大于||


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值