小三角形,大三角形代码不起作用
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;
}
所以,我一直在尝试在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;
}