C语言 请告知我不承保的情况

icomxhvb  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(87)
  • 给定两个平行于坐标轴的矩形,求它们所覆盖的面积。
    **输入格式:**输入的第一行包含T -测试用例的数量。其后是2 T行。每个测试用例的第一行包含4个整数- xbl,ybl,xtr,ytr -矩形-1的左下和右上坐标。每个测试用例的第二行包含4个整数- xbl,ybl,xtr,ytr -矩形-2的左下和右上坐标。

制约因素

  • 1〈= T〈= 10000
  • -106
  • (xbl,ybl)〈(xtr,ytr)
    **输出格式:**对于每个测试用例,打印2个矩形覆盖的区域,用换行符分隔。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

unsigned int recarea(int x1,int y1,int x2,int y2){
    int area=0;
    area=(x2-x1)*(y2-y1);
    return abs(area);
}

unsigned int overarea(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4){
    int top=fmin(y2,y4);
    int bottom=fmax(y1,y3);
    int left=fmax(x1,x3);
    int right=fmin(x2,x4);
    int overlaparea=0;
    if(bottom<top && left<right){
        overlaparea=recarea(left,bottom,right,top);
    }
    return abs(overlaparea);
}

int main() {
    int testcases=0;
    scanf("%d",&testcases);
    for(int i=0;i<testcases;i++){
        int x1,x2,y1,y2,x3,x4,y3,y4;
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        scanf("%d %d %d %d",&x3,&y3,&x4,&y4);
        int area=recarea(x1,y1,x2,y2)+recarea(x3,y3,x4,y4)- 
         overarea(x1,y1,x2,y2,x3,y3,x4,y4);
        printf("%d\n",area);
    }   
    return 0;
}

对于矩形1,变量x1、y1是左下坐标,x2、y2是右上坐标。对于矩形2,变量x3、y3是左下坐标,x4、y 4是右上坐标。

wqnecbli

wqnecbli1#

请告知我不承保的情况

    • 使用更广泛的数学**

area=(x2-x1)*(y2-y1);在给定-106
最大面积约为4 * 1012,在大多数int实现(32或16位)的范围之外。
long long * 至少 * 涵盖范围-(263 + 1)...+(263 + 1)

long long recarea(int x1, int y1, int x2, int y2) {
    long long area = (0LL + x2 - x1)*(0LL + y2 - y1);
    return llabs(area);
}

   long long area = recarea(...
   printf("%lld\n",area);

同时调整overarea()

    • 其他**

可能存在其他功能问题。例如:int可以小到16位。请考虑改用long来处理-106〈x,y〈= 106。

    • 在一旁**

代码在fmin(), fmax()中使用浮点函数。我使用了一个只使用整数的方法,而不是在FP和整数之间切换时遇到各种问题。在小范围内看起来还可以,但对于较大的值就不行了。

相关问题