6206 Apple 【大數計算之Java】
阿新 • • 發佈:2019-02-07
傳送門
//題意: 給定圓上三點, 問第四個點是否在圓內.
//思路: 題意很簡單, 方向也很好做. 直接求圓心, 求距離比較即可. 麻煩的是點的座標範圍都很大. 所以導致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++的話就可以看出來非常簡單了.