蓝桥杯2021javaB组直线

题目:直线

在平面直角坐标系中,两点可以确定一条直线。
如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
给定平面上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) 之间的整数的点。
请问这些点一共确定了多少条不同的直线。(填空题)
————————————————

做这个题目大部分都是采用点斜式即y=kx+b;其中k=(y2-y1)/(x2-x1);b=y1-kx1;

我们用Set进行对(k,b)的去重,但是注意k,b很容易成为浮点数,所以大部分采用字符串形式来表达k和b。下面直接代码:

import java.util.HashSet;
import java.util.Set;

public class 直线 {//两点式;
static Set set=new HashSet();
	public static void main(String[] args) {
		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;//斜率为零或不存在自己手动计算
						}
						StringBuilder sb=new StringBuilder();//在set内添加删改容易出现错误所以创建一个新的来进行添加数据
						int up=y2-y1;
						int down=x2-x1;
						int k=gdc(up, down);//计算最大公约数
						sb.append(up/k+" ");
						sb.append(down/k+" ");//这两个是计算斜率的即k=(up/down);
						int b=y1*down/k-x1*up/k;
						sb.append(b);//这是计算截距b
						set.add(sb.toString());
					}
				}
			}
		}
		System.out.println(set.size()+21+20);
	}
	static int gdc(int a,int b) {
		return b==0?a:gdc(b, a%b);
	}
}

 

 

你可能感兴趣的:(Java,蓝桥杯,java)