算法竞赛入门经典-1.5.4 Q&A
这小节考察实践能力,要求在不要查书、不要网上找答案,自己用实验的方法解决以下五个问题:
做这五道题时,好几道都没思路,违反了规则到网上找了一圈,居然没找到答案,于是打算写这篇博客。不知是否有更好的实践方法,欢迎讨论。
Q1:c语言中,int型整数的最小和最大值是多少?(精确解)
A1:用实验的方法可以这样得到:利用int最大的正数溢出时符号为改变的特性。
1 int b = 0; 2 while(b >= 0) 3 b++; 4 printf("%d %d\n", b, b-1);
Q2:C语言中,double型浮点数能精确到多少位小数?
A2:通过观察无限循环小数,在第多少位出现不准确的输出大致获得。
1 printf("%.50lf\n", 1.0/3);
Q3:C语言中,double型浮点数最大整数值与最小整数值分别是多少?(不必特别精确)
A3:最小的整数值和Q2的解相当,最大整数值。可以用double溢出时,gcc编译器值一直是inf,来大概判断。
1 double a=10; 2 while(1) 3 { 4 a = a * 10; 5 printf("%e\n",a); 6 if(a == 1.0/0.0) 7 break; 8 }
Q4:判断a&&b||c,应该理解成(a&&b)||c还是a&&(b||c)?
A4:通过观察我们发现a, b, c分别是0, 0, 1时,(a&&b)||c和a&&(b||c)输出分别为1, 0,这样,执行a&&b||c,对比结果就可以判断出优先级。
1 printf("%d %d\n%d\n", (0&&0)||1, 0&&(0||1), 0&&0||1);
Q5:if(a) if(b) x++;else y++;的else与哪个if匹配?
A5:这个好构建。