如果用两个 int 类型的变量 a 和 b 分别表达直角三角形两条直角边的长度,则下列哪个表达式可以用来计算三角形的面积?( )
这题表面考面积公式,实则考C++整数运算的坑。拿到题先想:a和b是int,直接除会丢小数。所以千万别写a * b / 2,必须引入浮点常量0.5来强制类型提升,这样算出来的才是带小数的面积。
最容易栽跟头的是选A,觉得公式没错,却忘了int相除直接截断小数;还有人会选B,以为先除后乘和先乘后除一样,其实a是奇数时a/2已经丢精度了;最阴险的是C,1/2在int运算里直接等于0,整题结果全是0。记住,C++里写数学公式,常量一定要用0.5这种浮点形式,别偷懒用1/2。
【考点】整数除法与浮点常量
GESP一级C++组专门卡住那些"以为数学公式直接就能用"的考生:直角三角形面积公式确实是a×b÷2,但C++里两个int相除会直接丢弃小数,这才是绝大多数人栽跟头的地方。
【解题思维】 公式是a × b ÷ 2,但a、b都是int,运算顺序从左到右:
所以A(a * b / 2)在a×b为奇数时直接错;B(a / 2 * b)更离谱,先除a就丢了a的小数部分;C的1/2在int里等于0,整题变0;只有D用浮点常量0.5,强制把运算提升为浮点,结果正确。
【陷阱拆解】
【反命题思维】 如果a、b改成double,那A就正确了(浮点除法保留小数);如果问的是任意三角形面积,就得用海伦公式;如果问的是圆面积,π必须用浮点常量3.14159…
记住:C++里写数学公式,常量用0.5不用1/2,类型决定一切。