Hackerrank C语言Small Triangles, Large Triangles题排序异常问题求助
问题原因及修复方案
你的代码存在两处核心错误,直接修改即可解决排序异常问题:
1. swap函数参数类型设计错误
你当前的swap函数是用于交换两个struct triangle*类型的指针,但你传入的参数是结构体数组中元素的地址,数组内存储的是struct triangle实体而非指针,类型不匹配会导致结构体内部数据被错误改写,完全打乱原有内容。
修复后的swap函数:
void swap(struct triangle *xp, struct triangle *yp) { struct triangle temp = *xp; *xp = *yp; *yp = temp; }
调用逻辑无需修改,仍使用swap(&tr[j], &tr[j+1])即可。
2. area函数存在精度丢失和溢出风险
你当前的实现存在三个问题:
- 半周长整除操作会在三边和为奇数时丢失精度,导致面积计算错误
- 浮点数开平方后转int会截断小数部分,面积接近的三角形会被判定为面积相等
- int类型存储乘积容易溢出,导致数值错误
优化后的area实现:
不需要实际计算面积,直接比较海伦公式中面积平方的大小即可(平方根为单调递增函数,面积平方的大小顺序与面积完全一致),同时规避浮点运算和除法操作:
// 直接返回面积平方的16倍,数值大小顺序和面积大小顺序完全一致 long long area(int a, int b, int c){ long long p = a + b + c; return p * (p - 2*a) * (p - 2*b) * (p - 2*c); }
修改后sort_by_area函数的比较逻辑无需改动,直接比较两个area返回值即可。
内容的提问来源于stack exchange,提问作者KaraageAndKamehameha
相关产品推荐
相关产品推荐

