楼主你好。#include stdio.h#includestdlib.h#includemath.h#define f(x1,y1,x2,y2) sqrt(pow(x2-x1,2)+pow(y2-y1,2))这是一个宏定义,其意义是计算x1y1与x2y2两点间的距离void main(){float *x,*y,s=0;int i,j,n;scanf(%d,n代表n个点,n个点就需要2n个float的空间,因为一个点需要两个float分别代表横纵坐标x=(float*)malloc(sizeof(float)*n*2);分配2n个float大小的内存空间并让x指向这个空间y=x+n;前n个float代表横坐标,后n个float代表纵坐标。已知x指向了横坐标的第一个float值,y在x的基础上后移n个float的内存空间,指向纵坐标的第一个值。for(i=0;in;i++)scanf(%f%f,x+i,y+i);将横纵坐标同是写入x+i和y+i所指向的内存区域,也就是第i个横坐标和纵坐标。for(i=0;in-1;i++)下面详细讲for(j=0;jn;j++)s+=f(x,y,x[j],y[j]);printf(%2.fn,s);}最后那个循环我觉得是为了计算这n个点间的距离总和,但是貌似有问题。假设有三个点,0,1,2。那么该循环中i就是从0到1,j就是从0到2。i为0的时候计算00,01,02三条线段的距离并都加到s中去。i为1的时候计算10,11,12三条线段的距离并都加到s中去。至此循环结束。你会发现00和11的长度肯定是0,因此计算了01,02,10,12这四条线段的长度,但是01和10其实重复了。所以其实应该是:for(i=0;in-1;i++)for(j=i+1;jn;j++)这样,仍假设n为3,i是从0到1,j是从i+1到2:i为0的时候,j是从1到2,所以计算了01,02这两条边。i为1的时候,j是从2到2,所以计算了12这条边。这样才是没有重复计算,是真正计算n个点间距离和的算法。以上是我的分析,今天不方便,就不上机测试了,有不懂得可以追问。也可以等我周一上机试一试,不过估计跟我思考结果一样。来自:求助得到的回答
|