You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:48:01