1.题目描述
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,
那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点 {(x,y)|0 ≤ x < 2,0 ≤ y < 3, x ∈ Z,y ∈ Z},即横坐标
是 0 到 1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数
的点。这些点一共确定了 11 条不同的直线。
给定平面上 20 × 21 个整点 {(x,y)|0 ≤ x < 20,0 ≤ y < 21, x ∈ Z,y ∈ Z},即横
坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之
间的整数的点。请问这些点一共确定了多少条不同的直线
2.思路及函数接口
设直线y=kx+b
设两点P(x1,y1),Q(x2,y2) 所以斜率是k=(y2-y1)/(x1-x2)
将P点代入直线 可得 y1=dy/dx *x1+b
b=(y1dx-x1dy)/dx
注意点
关键是存储(k,b)的值,因为两点确定一条直线。
而且(k,b)不能有重复,所以要用set()去掉重复元素。
而且要用最小公倍数对k,b约分。
最后还要考虑平行x轴和y轴的直线。
3.代码实现
package 蓝桥杯;
import java.util.HashSet;
import java.util.Set;
public class 直线 {
public static int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set=new HashSet<>();
for(int x1=0;x1<20;x1++)
{
for(int y1=0;y1<21;y1++)
{
for(int x2=0;x2<20;x2++)
{
for(int y2=0;y2<21;y2++)
{
if(x1==x2||y1==y2)
continue;//直线有平行x轴和平行y轴的情况
int y=y2-y1;
int x=x2-x1;
//将k斜率进行约分
int g1=gcd(x,y);//最小公倍数
String k=(y/g1)+"/"+(x/g1);
//将b截距进行约分
int fenzi=y1*x-x1*y;
int fenmu=x;
int g2=gcd(fenzi,fenmu);
String b=(fenzi/g2)+"/"+(fenmu/g2);
set.add(k+","+b);
}
}
}
}
//另外加上平行x轴和y轴的直线
System.out.println(set.size()+20+21);
}
}
4.答案
40257