HDU - 6206 Apple 【大数计算之Java】

传送门
//题意: 给定圆上三点, 问第四个点是否在圆内.
//思路: 题意很简单, 方向也很好做. 直接求圆心, 求距离比较即可. 麻烦的是点的坐标范围都很大. 所以导致ll都会爆, 精度也很难保证. 所以比赛时就想用到Java来实现高精度计算. 就是太久没碰Java了, 写起来很是生疏…. 这次相当于复习下Java了. 注意一点就是, 就是在嵌套使用大数之间的运算的时候, 如果实在不是很懂怎么运算的, 就多打几个括号就行了. 凡是进行了一次运算时就要用到它时, 就打一个括号!!!

Ac Code

import java.io.*;  
import java.math.*;  
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        int t; t = cin.nextInt();
        for(int i=1;i<=t;i++){
            BigDecimal x1 = cin.nextBigDecimal();
            BigDecimal y1 = cin.nextBigDecimal();
            BigDecimal x2 = cin.nextBigDecimal();
            BigDecimal y2 = cin.nextBigDecimal();
            BigDecimal x3 = cin.nextBigDecimal();
            BigDecimal y3 = cin.nextBigDecimal();
            BigDecimal x4 = cin.nextBigDecimal();
            BigDecimal y4 = cin.nextBigDecimal();
            BigDecimal one = new BigDecimal(-1);
            BigDecimal two = new BigDecimal(2);

            BigDecimal xm = (x1.add(x2)).divide(two);
            BigDecimal ym = (y1.add(y2)).divide(two);
            BigDecimal px1 = xm.add(ym.subtract(y1));
            BigDecimal py1 = ym.subtract(xm.subtract(x1));
            BigDecimal px2 = xm.subtract(ym.subtract(y1));
            BigDecimal py2 = ym.add(xm.subtract(x1));

            xm = (x1.add(x3)).divide(two);
            ym = (y1.add(y3)).divide(two);
            BigDecimal px3 = (xm.add(ym)).subtract(y1);
            BigDecimal py3 = (ym.subtract(xm)).add(x1);
            BigDecimal px4 = (xm.subtract(ym)).add(y1);
            BigDecimal py4 = (ym.add(xm)).subtract(x1);

            BigDecimal k1 = (px4.subtract(px3)).multiply(py2.subtract(py1));
            BigDecimal k2 = (px2.subtract(px1)).multiply(py4.subtract(py3));

            BigDecimal a,b,c,d,e,f,ans_x,ans_y;
            a = k1.multiply(px1);
            b = k2.multiply(px3);
            c = py3.subtract(py1);
            d = px2.subtract(px1);
            e = px4.subtract(px3);
            f = k1.subtract(k2);
            ans_x = ((a.subtract(b)).add((c.multiply(d)).multiply(e))).divide(f);
            a = k2.multiply(py1);
            b = k1.multiply(py3);
            c = px3.subtract(px1);
            d = py2.subtract(py1);
            e = py4.subtract(py3);
            f = k2.subtract(k1);
            ans_y = ((a.subtract(b)).add((c.multiply(d)).multiply(e))).divide(f);

            BigDecimal r, dis;
            a = ans_x.subtract(x1); b = ans_y.subtract(y1);
            r = (a.multiply(a)).add(b.multiply(b));
            a = ans_x.subtract(x4); b = ans_y.subtract(y4);
            dis = (a.multiply(a)).add(b.multiply(b));

            //d.compart(r) d > r == 1; d < r == -1; d == r == 0;
            if(dis.compareTo(r) == 1){
                System.out.println("Accepted");
            }
            else{
                System.out.println("Rejected");
            }
        }
    }
}

注: 我上面都细分了许许多多的小公式, 就是因为大数运算的括号里套过来套过去的, 为了逻辑的清楚, 所以全部细分出来, 并且尽量多大括号, 以分清哪里是哪里, 单独写. 公式也是很简单的. 用C++的话就可以看出来非常简单了.

你可能感兴趣的:(大数计算)