C求多边形面积

会打代码的扫地王大爷 学生  2014-01-26 10:11:30
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。

Output
对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。

Sample Input
3 0 0 1 0 0 1
4 1 0 0 1 -1 0 0 -1
0

Sample Output
0.5
2.0

我在自己电脑上可以测试通过,可是就是无法AC,请问是哪里错了吗?
#include<stdio.h>
#include<math.h>
int main()
{
int count,i;
float s,sum,a[200];
while(scanf("%d",&count)!=EOF&&count!=0)
{
for(i=0;i<count*2;i++)
scanf("%f",a+i);
for(i=2,sum=0;i<count;i++) //点1跟点2,3配对,点1跟点3,4配对.......点1跟点count-1和count配对
{
s=(fabs((a[2*i-2]-a[0])*(a[2*(i+1)-1]-a[1]))+fabs((a[2*(i+1)-2]-a[0])*(a[2*i-1]-a[1])))/2;
//这是用三角形面积为(|(x1-x0)*(y2-y0)|+|(x2-x0)*(y1-y0)|)/2来求的。

sum+=s;
}
printf("%.1f\n",sum);
}
}
...全文
150 点赞 收藏 4
写回复
4 条回复
孩皮妞野 2014年01月27日
哦,你直接把a[]定义成float了,那不用再cast, 也可考虑用double, 如果考虑了凹多边形不能解决问题的话。
回复 点赞
孩皮妞野 2014年01月27日
第二个: s=(fabs((a[2*i-2]-a[0])*(a[2*(i+1)-1]-a[1]))+fabs((a[2*(i+1)-2]-a[0])*(a[2*i-1]-a[1])))/2; 乘法可能溢出(加减也可能溢出),可以先cast成float再运算。

inline float _a(int i){ return float(a[i]); }

...
s=(fabs((_a(2*i-2)-a[0])*(_a(2*(i+1)-1)-a[1]))+
      fabs((_a(2*(i+1)-2)-a[0])*(_a(2*i-1)-a[1])))/2;
回复 点赞
孩皮妞野 2014年01月27日
要注意凹多变形的问题。 比如

----------
|       /
|      /
|      \
|       \
|---------

你如果从坐上出发,用你的方法得到结果的必定会大得多。不知道题目有没有明确说明是凸多边形。
回复 点赞
baihacker 2014年01月26日
typdef long long int64; 所有中间过程全部用int64. 设这些点是(data[0].x, data[0].y) ... (data[n-1].x, data[n-1].y) 在最后一个点:(data[n].x, data[n].y) = (data[0].x, data[0].y) 然后计算 data[i].x data[i].y data[i+1].x data[i+1].y 的行列式求和得到S,其中i从0到n-1。 S取绝对值。 S为偶数时,答案是[S/2].0 S为奇数时,答案为[S/2].5
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告