2017 ACM/ICPC Asia Regional Qingdao Online 1001-Apple(Java大实数类BigDecimal应用)(已知三点坐标求圆心坐标和半径)

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=6206

题目大意

给你三个点(x1, y1), (x2, y2), (x3, y3), 可以确定一个圆, 再给你一个点(x, y), 问你该点和圆的关系,在圆外输出Accept, 在圆内或圆上输出Rejected

思路

比赛的时候题目乍一看思路很简单,就是根据三点算出圆的圆心和半径, 再比较点(x, y)到圆心距离和半径的大小就行了
可是比赛的时候这题将近200发提交没有一个人过
我队友用C++试了一下随便造了组数据就发现精度不够了
这时候就要Java的高精度类BigDecimal了

已知三点求圆的圆心坐标以及半径模板

a = 2 * (x2 - x1);
b = 2 * (y2 - y1);
c = x2 * x2 + y2 * y2 - x1 * x1 - y1 * y1;
d = 2 * (x3 - x2);
e = 2 * (y3 - y2);
f = x3 * x3 + y3 * y3 - x2 * x2 - y2 * y2;
x = (b * f - e * c) / (b * d - e * a);
y = (d * c - a * f) / (b * d - e * a);
r = sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));

高精度类BigDecimal用法(浮点数)

(一)BigDecimal类的常用的几个构造方法

  • BigDecimal(int):将int表示形式转换为BigDecimal对象
  • BigDecimal(String) :将字符串表示形式转换为BigDecimal对象
  • BigDecimal(double):将double表示形式转换为BigDecimal对象

(二)BigDecimal类的常用方法

  • add(BigDecimal):BigDecimal对象中的值相加,返回BigDecimal对象
  • subtract(BigDecimal):BigDecimal对象中的值相减,返回BigDecimal对象
  • multiply(BigDecimal):BigDecimal对象中的值相乘,返回BigDecimal对象
  • divide(BigDecimal):BigDecimal对象中的值相除,返回BigDecimal对象
  • remainder(BigDecimal):BigDecimal对象中的值取余,返回BigDecimal对象
  • toString():将BigDecimal对象中的值转换成字符串
  • doubleValue():将BigDecimal对象中的值转换成双精度数
  • floatValue():将BigDecimal对象中的值转换成单精度数
  • longValue():将BigDecimal对象中的值转换成长整数
  • intValue():将BigDecimal对象中的值转换成整数
    (具体可参考此博客http://blog.csdn.net/qq_20785431/article/details/52281841

代码

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

public class Main {    //ACM竞赛中Java主类名一定要是Main
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        for(int k=0; k<T; ++k)
        {
            BigDecimal x1 = in.nextBigDecimal();
            BigDecimal y1 = in.nextBigDecimal();
            BigDecimal x2 = in.nextBigDecimal();
            BigDecimal y2 = in.nextBigDecimal();
            BigDecimal x3 = in.nextBigDecimal();
            BigDecimal y3 = in.nextBigDecimal();
            BigDecimal x = in.nextBigDecimal();
            BigDecimal y = in.nextBigDecimal();

            BigDecimal a = x2.subtract(x1).multiply(BigDecimal.valueOf(2));
            BigDecimal b = y2.subtract(y1).multiply(BigDecimal.valueOf(2));
            BigDecimal c = (x2.multiply(x2).add(y2.multiply(y2))).subtract(x1.multiply(x1)).subtract(y1.multiply(y1));
            BigDecimal d = x3.subtract(x2).multiply(BigDecimal.valueOf(2));
            BigDecimal e = y3.subtract(y2).multiply(BigDecimal.valueOf(2));
            BigDecimal f = (x3.multiply(x3).add(y3.multiply(y3))).subtract(x2.multiply(x2)).subtract(y2.multiply(y2));
            BigDecimal g = b.multiply(d).subtract(e.multiply(a));

            BigDecimal rx = b.multiply(f).subtract(e.multiply(c)).divide(g);
            BigDecimal ry = d.multiply(c).subtract(a.multiply(f)).divide(g);

            BigDecimal t1 = rx.subtract(x1);
            BigDecimal t2 = ry.subtract(y1);
            BigDecimal r = t1.multiply(t1).add(t2.multiply(t2));

            t1 = rx.subtract(x);
            t2 = ry.subtract(y);
            BigDecimal rr = t1.multiply(t1).add(t2.multiply(t2));

            if(rr.compareTo(r) == 1) System.out.println("Accepted");
            else System.out.println("Rejected");
        }
        in.close();
    }
}

心得

劳资学的Java终于派上用场了。。。
这次我比赛做了两题。。总算是有点贡献了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值