试题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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现