杭电2036——改革春风吹满地(Java)

Input
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在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();
        }
    }
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值