2021年蓝桥杯JAVAB组直线问题

题目:

在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。

给定平面上 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) 之 间的整数的点。请问这些点一共确定了多少条不同的直线。


答案:40257

代码:

import java.security.KeyStore.Entry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class 直线问题 {
	public static  int gcd(int a,int b) {
	 return b==0?a:gcd(b, a%b);
		
	}
	public static String getHsh (int x1,int y1,int x2,int y2) {
		  if (x1==x2) {
		 	 return  "x=" + x1;
		}else {
		String k=getK( x1, y1, x2,y2);
		String b=getb(x1, y1, x2, y2);
		return  b+" "+k;
		
		}
	
	}
	private static String getb(int x1, int y1, int x2, int y2 ) {
		// TODO 自动生成的方法存根
		int bfm=x2-x1;
		int bfz=y1*(x2-x1)-x1*(y2-y1);
	int gys	=gcd(bfz, bfm);
		bfm=bfm/gys;
		bfz=bfz/gys;
		return bfz+" "+bfm;
	}
	public static String getK(int x1,int y1,int x2,int y2) {
		int kfm=x2-x1;
		int kfz=y2-y1;
		int gys=gcd(kfz, kfm);
		kfz=kfz/gys;
		kfm=kfm/gys;
		
		return kfz+" "+kfm;
	}


	public static void main(String[] args) {
	Set<String> aSet=new HashSet<>();	
//储存坐标的容器
	List<Integer> aList=new ArrayList<>();
	
for (int i = 0; i < 20; i++) {
	for (int j = 0; j <21; j++) {
		aList.add(i*100+j); //坐标x=(i*100+j)/100,y=(i*100+_j)%100
	}
}
for (int i1 = 0; i1 < aList.size(); i1++) {
	int x1=aList.get(i1)/100;int y1=aList.get(i1)%100;
for (int j = 0; j <aList.size(); j++) {
	
	int x2=aList.get(j)/100;int y2=aList.get(j)%100;
	String aString= getHsh(x1, y1, x2, y2);
	aSet.add(aString);
	
	
}	
}
for (String integer : aSet) {
	System.out.println(integer);
}System.out.println(aSet.size());
}
}

 String类yyds!

因为b的精度太高了不管你用double或者是BigInteger都没有用,他的精度可以说是小数点往后无数循环,因此2我们用字符串形式的分数表示k和b,但是为了防止重复要算出其最大公约数,使用方法为gcd(int a,int  b){return b==0?a:gcd(b,a%b);}

最最最好用而又巧妙的是用数字来表示坐标的算法:int a=i*100+j;坐标x=a/100.y=a%100!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值