可以帮忙解释下备注处的么,谢谢

[复制链接]
查看11 | 回复2 | 2013-1-24 11:50:13 | 显示全部楼层 |阅读模式
楼主你好。#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个点间距离和的算法。以上是我的分析,今天不方便,就不上机测试了,有不懂得可以追问。也可以等我周一上机试一试,不过估计跟我思考结果一样。来自:求助得到的回答
回复

使用道具 举报

千问 | 2013-1-24 11:50:13 | 显示全部楼层
很慢理解啊,这是什么题目啊亲。赞同0|评论
回复

使用道具 举报

千问 | 2013-1-24 11:50:13 | 显示全部楼层
hhhhhhhhhhh赞同0|评论
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行