试题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