arrays - 小三角形,大三角形代码不起作用
问题描述
因此,我一直在尝试在 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;
}```
解决方案
启用所有警告
这很快导致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;
}
推荐阅读
- python - python:dict到groupby相似关键元素的列表
- maven - 通过 maven 打包现有的战争
- django - django反向函数导入
- python - 求 m 的两个除数,d1>1 和 d2>1,其中 gcd(d1+d2, m)=1
- python - 如何遍历 100 个 Url 并使用 selenium 从每个 URL 中提取信息
- angular - 发出打开天气 api 的 http 请求时出现未知错误
- amazon-qldb - 我们如何管理 QLDB 中的大量用户?
- c - char * 与 unsigned char* 有什么区别?
- diff - 两个具有完全相同汇编代码的编译二进制文件在破解二进制文件时表现不同?或者我可能错过了什么?
- visual-studio-code - 是否有一个键绑定来聚焦 VSCode 中已经打开的搜索编辑器?