struggle_wei 2024-06-02 09:43 采纳率: 0%
浏览 3

求最小直径,求解答,求改错

img

img


#include<stdio.h>
#include<math.h>
struct point
{ double x,y,z;
}a[10004];
double dist2(double a, double b,double c,double d)
{ double dx,dy;
  dx=a-c; dy=b-d;
  return sqrt(dx*dx+dy*dy);
}
int main()
{   
    int i,n,j;
    double rx,s,ry,rz,min,x0,y0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z);
    rx=dist2(a[0].x,a[0].y,a[1].x,a[1].y)/2;
    x0=(a[0].x+a[1].x)/2;y0=(a[0].y+a[1].y)/2;
        for(j=2;j<n;j++)
        {
            s=dist2(x0,y0,a[j].x,a[j].y);
            if(s>rx)
            {  x0=(a[0].x+a[j].x)/2;y0=(a[0].y+a[j].y)/2;
                rx=dist2(a[0].x,a[0].y,a[j].x,a[j].y)/2; 
            
            }
        }
       
    
    ry=dist2(a[0].y,a[0].z,a[1].y,a[1].z)/2;
    x0=(a[0].y+a[1].y)/2;y0=(a[0].z+a[1].z)/2;  
        for(j=2;j<n;j++)
        {
            s=dist2(x0,y0,a[j].y,a[j].z);
            if(s>ry)
            {  x0=(a[0].y+a[j].y)/2;y0=(a[0].z+a[j].z)/2;
                ry=dist2(a[0].y,a[0].z,a[j].y,a[j].z)/2; 
                
            }
       }
    
rz=dist2(a[0].x,a[0].z,a[1].x,a[1].z)/2;
x0=(a[0].x+a[1].x)/2;y0=(a[0].z+a[1].z)/2;
 
        for(j=2;j<n;j++)
        {
            s=dist2(x0,y0,a[j].x,a[j].z);
            if(s>rz)
            {
                rz=dist2(a[0].x,a[0].z,a[j].x,a[j].z)/2; 
                x0=(a[0].x+a[j].x)/2;y0=(a[0].z+a[j].z)/2;
                
            }
       }
    
    double h[3];
    h[0]=2*rx;h[1]=2*ry;h[2]=2*rz;
    min=h[0]; 
    for(i=1;i<3;i++)
    {
        
        if(min>h[i])
        min=h[i];
    }
    printf("%.5lf",min);
    return 0;
 } 

这样写哪里错了,怎么改

  • 写回答

3条回答 默认 最新

  • 关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    你的代码中存在一些逻辑问题和不必要的重复计算。首先,你需要找到三个最小的直径,分别对应于 x、y 和 z 方向上的最小距离。然后,输出这三个直径中的最小值作为答案。以下是修改后的代码:

    #include<stdio.h>
    #include<math.h>
    
    struct point {
        double x, y, z;
    };
    
    double dist2(struct point a, struct point b) {
        return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
    }
    
    int main() {
        int n, i, j;
        double minDiameter = DBL_MAX; // 初始化为最大值
        struct point flaws[10004];
    
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
            scanf("%lf %lf %lf", &flaws[i].x, &flaws[i].y, &flaws[i].z);
        }
    
        for (i = 0; i < n; i++) {
            double diamX = dist2(flaws[i], flaws[(i + 1) % n]);
            double diamY = dist2(flaws[i], flaws[(i + n / 2) % n]);
            double diamZ = dist2(flaws[i], flaws[(i + n - 1) % n]);
    
            minDiameter = MIN(minDiameter, diamX);
            minDiameter = MIN(minDiameter, diamY);
            minDiameter = MIN(minDiameter, diamZ);
        }
    
        printf("%.5lf", minDiameter);
        return 0;
    }
    

    在这个修改后的代码中:

    1. 我删除了冗余的 x0y0 变量,因为它们不是必要的。
    2. 使用 dist2 函数计算两点之间的距离,简化了计算。
    3. 使用 MIN 函数(这里没有直接的函数,但你可以自己实现一个或者使用 std::min)来找到三个方向上最小的直径。
    4. 在每次循环中,计算三个方向上的直径,并更新最小直径。

    请注意,这个代码假设输入的点是按顺序排列的(例如,第一行是第一个点,第二行是第二个点,以此类推)。如果输入点没有特定顺序,你需要稍微调整循环的方式来处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月2日

悬赏问题

  • ¥20 c语言写的8051单片机存储器mt29的模块程序
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大