《算法竞赛入门经典(第2版)》第一章笔记及章末思考题

参考链接: 如何用printf输出%d:https://blog.csdn.net/ben1010101010/article/details/89256603

  • printf的用法

    • %d
    • %.nf 小数点后几位
  • 在算法竞赛中,每行输出均应以回车符结束,包括最后一行。

  • 注意考虑题中错误输入的情况

  • 短路(short-circuit)

    C语言中的逻辑运算符都是短路运算符,一旦能确定整个表达式的值,就不再继续计算。

  • sqrt(-10) 结果是 -nan(ind)

    Nan是“Not a number”的缩写

    ind是“ indeterminate”,即无法确定的数

  • 1.0/0.0 0.0/0.0 1/0 都会报错:被零除或对零取模

  • #include<iostream>
    using namespace std;
    int main()
    {
       int a,b;
       scanf("%d%d",&a,&b);
       printf("%d %d\n",a,b);
       return 0;
    }
    

    输入:12 s a会正常读取 b无法读取 scanf返回值为0

    利用下面的代码来验证上述的猜想

    #include<iostream>
    using namespace std;
    int main()
    {
        int a=100,b=200;
        int flag=100;
        flag=scanf("%d%d",&a,&b);
        printf("%d %d\n",a,b);
        printf("%d\n",flag);
    }
    

    输入12 s

    输出结果为

    12 200
    1
    

    证明在输入字符时,b并没有进行输入,保持原有的初始值200,

    flag 为scanf()正确读取的字符数 1。

  • 如何用printf输出%d

    #include <stdio.h> 
    int main()
    {
        printf("%%d\n");
        getchar();
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        printf("%c",'%');
        printf("d\n");
        getchar();
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        printf("%sd\n","%");
        getchar();
        return 0;
    }
    

    思考问题:

    1. int型整数的最小值和最大值是多少?

      int占8字节共32位 其中有一位是符号位 最大值231-1=2147483647 最小值为-231=-2147483648

    2. double型浮点数能精确到多少位小数?或者,这个问题本身值得商榷?

      笔者认为这个问题值得商榷,因为笔者认为能精确到小数的位数,与有效数字的大小有关系

      #include<stdio.h>
      int main()
      {
          double a;
          scanf("%lf",&a);
          printf("%.20lf",a/3.0);
      }
      

      a输入为1.0时,输出结果为0.3333333333333331000精确到小数点后第16位。

      a输入为5.0时,输出结果为1.66666666666666670000精确到小数点后第17位。

      所以double的精确度应该在15和16位之间浮动。

    3. double型浮点数最大正数值和最小正数值是多少?(不必特别精确)

      最小正数值:化成二进制只有最后一位为0,所以最小值为2-1075=2.22507e-308

      最大正数值:

      IEEE 754规定,超过2^1024的数就会发生正向溢出,记为Infinity(inf)

    4. 逻辑运算符“&&”、“||”和“!”(表示逻辑非)的相对优先级是怎样的?也就是说,a&&b||c应理解为(a&&b)||c还是a&&(b||c),或者是随便怎么理解都可以?

      我们令a=0,b=0,c=1,如果按第一种结合方式,结果应该为1,而如果按照第二种结合方式的话,结果应该为0, 如果是随机的话,答案也会随机(肯定不可能)。

        #include<stdio.h>
      		int main()
      		{
             		int a=0,b=0,c=1;
          		printf("%d",a&&b||c);
          	}
      

      按照上述程序进行实验,输出结果为1,证明相对优先级是(a&&b)||c。
      解释:优先级:!>&&>||
      ​ 结合方向: &&、||左结合
      ​ !右结合

    5. if(a) if(b)x++; else y++;的确切含义是什么?这个else应和哪个if配套?有没有办法明确表达出配套方法?

      else y++;应与 if(b)x++;配套

      验证:

      #include<stdio.h>
      int main()
      {
          int x=1,y=2;
          int a=1,b=0;
          if(a)
              if(b)x++;
          	else
             		y++;
          printf("x=%d,y=%d",x,y);
      }
      

      若我们的猜想正确,输出结果应为x=1,y=3

      否则输出结果为x=1,y=2

      输出结果验证了我们的猜想

      解释:else应该与其上最近且未进行匹配的if配套

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值