首页 > 解决方案 > 小三角形,大三角形代码不起作用

问题描述

因此,我一直在尝试在 Hackerrank 中编写 C 的小三角形、大三角形问题的代码。之前,我说明了我面临的问题,我将附上问题- 在此处输入图像描述

我这里只写了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;
}```

标签: arrayscsortingstructswap

解决方案


启用所有警告

这很快导致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)q可能为不同的 s返回相同的值。

例子:(int) sqrt(100), (int) sqrt(110),(int) sqrt(120)
都返回 10。排序不一定会按面积排序。


简单地返回该区域的平方。在数学上,按面积平方排序与面积相同。

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

也许返回该区域的平方,每边按 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;
} 

推荐阅读