2021蓝桥杯javaB----直线

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值