小杨这学期准备参加 GESP 的 7 级考试,其中有关于三角函数的内容,他能够通过下面的代码找到结束循环的角度值。( )
int main()
{
double x;
do {
cin >> x;
x = x / 180 * 3.14;
} while (int(sin(x) * sin(x) + cos(x) * cos(x)) == 1);
cout << "//" << sin(x) << " " << cos(x);
cout << endl;
return 0;
}图的存储方式:邻接矩阵(O(n²)空间,适合稠密图)、邻接表(O(n+m)空间,适合稀疏图)。
有向完全图边数为n(n-1),无向完全图边数为n(n-1)/2。简单图不含自环和重边。
【考点】double类型精度陷阱|三角恒等式sin²+cos²=1|整型截断
🎯 考纲定位(考点定位) 考查GESP大纲中"数值类型与数学库"模块:double精度不足、sin/cos函数、do-while循环、int类型转换。命题人专卡"浮点运算结果与整型截断"的盲点,这是多数考生未深入思考的细节。该题在"循环控制"与"数值计算"交叉处设伏,是七级典型压轴风格。
🧠 解题思维(拆解与通法) 代码输入角度x后转为弧度,利用sin²+cos²=1恒等式,但double精度不足时常让sin(x)*sin(x)+cos(x)*cos(x)略小于1,int()截断后等于0,循环条件为假即退出。通法:遇到三角函数+整型转换,先验算数学恒等式,再考虑浮点误差对结果的影响。若sin²+cos²计算值落入[1,2)区间,int()后必为1,循环继续;落入[0,1)区间,int()后为0,循环终止。
🪤 陷阱拆解(命题人的套路) A正确——题目问能否"找到结束循环的角度值",代码在sin²+cos²因精度略小于1时,int截断为0,循环条件为假即退出,确实能终止。B错误——若认为sin²+cos²恒等于1,则int()后必为1,循环会无限执行。陷阱在于"恒等式≠实际计算结果",命题人利用数学直觉与代码行为的差异设坑。此题若改"==0"条件,答案会反转,可见命题人刻意制造"恒等式陷阱"。
🔄 反命题思维(教练升华) 若把条件改成!=1,因sin²+cos²≈1,int()后≈1,循环可能永不退出;若考察sin²+cos²=2,则int()后为1,循环条件为假即退出。刷到类似题先问:命题人想考我浮点精度还是数学恒等式?若改输入x为负数,sin²+cos²仍≈1,但x/180*3.14符号不变,循环行为不变——命题人用"符号不变"测试考生是否关注"绝对值"。