试题C:直线

题目

题目重点

  • 解题思路:计算两两点组成的直线的系数,并去重
  • 去重想到了set,添加进入set里面的元素会自动去重,最后用size()方法就可以求得个数
  • 系数有两种求法一种是Ax+By+C=0,另外一种是斜截式y=kx+b,可以两种都是可以的
  • 求最大公约数要用到的方法:辗转相除法
  • 斜截式:直接计算系数会出现精度损失导致计算结果不准确,所以建议用字符串去表示一个分数。而且斜截式必须考虑分母为0的情况,所以这里用普通式。
  • java里面没有python那么好用的list,可以list里面存list去存储一个坐标,这里只能将坐标表示为一个数字,用的时候再拆分开来计算即可。

代码

    //求最大公约数
    public int gys(int a,int b){
        return b==0?a:gys(b,a%b);
    }    

    @Test
    public void test06() {
        ArrayList<Integer> points = new ArrayList();
        HashSet<String>  lines= new HashSet<>();
        for (int i = 0; i < 20; i++) {
            for (int j = 0; j < 21; j++) {
                int point = i*100+j;
                points.add(point);
            }
        }
        int length = points.size();
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length; j++) {
                int x1=points.get(i)/100;
                int y1=points.get(i)%100;
                int x2=points.get(j)/100;
                int y2=points.get(j)%100;
                //求系数
                int a =y1-y2;
                int b =x2-x1;
                int c = x1*y2-x2*y1;
                //最大求公约数
                int gys=gys(gys(a,b),c);
                //化简
                if (gys!=0){
                    a=a/gys;
                    b=b/gys;
                    c=c/gys;
                    //去重
                    lines.add(a+":"+b+":"+c);
                }
            }
        }
        System.out.println("不同的直线数量是:"+lines.size());
    }

答案

40257

posted @ 2022-01-14 16:58  猪猪猪猪侠  阅读(95)  评论(0编辑  收藏  举报