Input
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
Output
对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。
每个实例的输出占一行。
从题目中我们可以看出,这道题就是已知多边形顶点,求多边形面积。求多边形面积的方法数学课应该都提过,分多个三角形来算,这里我们可以用现成的公式,
叉乘法。
需要注意的是,如果一系列点按逆时针排列算出的是正面积,而如果是顺时针的话算出的则是一个负面积.
题目说明是逆时针了,所以就不用取绝对值了。
S = 1/2×( ( X1*Y2-X2*Y1 ) + … + ( Xk*Yk+1-Xk+1*Yk ) + … + ( Xn*Y1-X1*Yn ) ) ---------- ①
S = 1/2((X1*Y2+X2*Y3+...+Xn*Y1)-(Y1*X2+Y2*X3+...+Yn*X1)) ---------- ②
知道这个公式,那么这题基本就过了,最后注意下保留一位小数,换行。 下面贴一下我自己的代码。
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n = sc.nextInt(); if(n==0) return; int x[] = new int[n]; int y[] = new int[n]; double s = 0; double s1 = 0; double s2 = 0; for(int i = 0;i<n;i++){ x[i]=sc.nextInt(); y[i]=sc.nextInt(); } for(int i =0;i<n;i++){ if(i+1==n){ s1+=x[i]*y[0]; s2+=y[i]*x[0]; }else{ s1 +=x[i]*y[i+1]; s2 +=y[i]*x[i+1]; } } s=0.5*(s1-s2); System.out.printf("%.1f",s); System.out.println(); } } }