小三角形,大三角形代码不起作用

Small Triangles, Large Triangles code not working

所以,我一直在尝试在Hackerrank中编写C的Small Triangles,Large Triangles问题的代码。之前,我陈述我面临的问题,我会附上问题 -

我这里只写了sort_by_area、swap和area函数。其余的都是给定的,不可改变的。我编写的代码已正确执行,但结构未正确排序。这是预期的输出和我的输出-

我只是不明白为什么它会被如此奇怪地交换。如果有人能提供帮助,那意义重大。

我的代码是-

#include <stdlib.h>
#include <math.h>

struct triangle
{
    int a;
    int b;
    int c;
};

typedef struct triangle triangle;
void sort_by_area(triangle* tr, int n) {
    int i, j, swapped;
    for (i = 0; i < n-1; i++)
   {
     swapped = 0;
     for (j = 0; j < n-i-1; j++)
     {
        if (area(tr[j].a, tr[j].b, tr[j].c) > area(tr[j+1].a, tr[j+1].b, tr[j+1].c))
        {
           swap(&tr[j], &tr[j+1]);
           swapped = 1;
        }
     }
     if (swapped == 0)
        break;
    }
}
void swap(struct triangle **xp, struct triangle **yp)
{
    struct triangle *temp = *xp;
    *xp = *yp;
    *yp = temp;
}
int area(int a, int b, int c){
       int p=(a+b+c)/2;
       int q=p*(p-a)*(p-b)*(p-c);
       return sqrt(q);
   }
int main()
{
    int n;
    scanf("%d", &n);
    triangle *tr = malloc(n * sizeof(triangle));
    for (int i = 0; i < n; i++) {
        scanf("%d%d%d", &tr[i].a, &tr[i].b, &tr[i].c);
    }
    sort_by_area(tr, n);
    for (int i = 0; i < n; i++) {
        printf("%d %d %d\n", tr[i].a, tr[i].b, tr[i].c);
    }
    return 0;
}```

启用所有警告

这很快导致 swap() 交换指针而不是数据。

// Corrected - swap data
void swap(struct triangle *xp, struct triangle *yp) {
  struct triangle temp = *xp;
  *xp = *yp;
  *yp = temp;
}

函数顺序

在调用它们之前移动 area()swap() 定义。


面积

(int) sqrt(q) 可能 return 不同 q 的相同值。

示例:(int) sqrt(100)(int) sqrt(110)(int) sqrt(120)
全部return10.排序肯定不会按区域排序


简单return面积的平方。在数学上,按与面积相同的面积平方排序。

int area_squared(int a, int b, int c){
   int p=(a+b+c)/2;
   int q=p*(p-a)*(p-b)*(p-c);
   // return sqrt(q);
   return q;
}

尽管可以使用 double 进行编码,但让我们继续使用整数。

注意 a+b+c 奇数,因为 odd/2 形成截断商。

也许 return 面积的平方,每边乘以 2?

int area_squared2(int a, int b, int c){
   a *= 2; b *= 2; c *= 2;
   // a+b+c is certianly even
   int p=(a+b+c)/2;
   int q=p*(p-a)*(p-b)*(p-c);
   return q;
}

剩下的问题是 int 溢出。考虑 long long 数学。

long long area_squared2LL(int a, int b, int c){
   long long aa = a * 2LL;
   long long bb = b * 2LL;
   long long cc = c * 2LL;
   long long pp = (aa+bb+cc)/2;
   long long qq = pp*(pp-aa)*(pp-bb)*(pp-cc);
   return qq;
}

提示:按引用数据分配,而不是类型

更容易正确编码、审查和维护。

// triangle *tr = malloc(n * sizeof(triangle));
triangle *tr = malloc(sizeof *tr * n);
if (tr == NULL) {
  // use tr 
  ...
  free(tr);
  tr = NULL;
}