1. 程式人生 > >6206 Apple 【大數計算之Java】

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++的話就可以看出來非常簡單了.