直线—省赛java

该博客分享了一道十二届蓝桥杯省赛C题的解题思路,主要涉及直线方程的计算。题目要求找到所有不同直线的表达式,使用Java编程实现。博主强调了在计算斜率KB时需要验证,并利用集合去重。解决方案中包含了最大公约数计算、坐标转换和分数形式的直线方程表示。最终,程序输出了不同直线的数量。
摘要由CSDN通过智能技术生成

十二届蓝桥杯省赛真题C题—直线

image-20220324111046685

这道题要比后边几道有难度
尤其是,在算KB的时候,自己一定要带入具体的例子验证一下

用到了去重,这个用set就很好解决,但是这个KB真不好想

import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class C_直线 {
    static Set<String> ans = new HashSet<>();
    //求最大公约数
    public static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }

    public static void getKB(int a, int b) {
    	//求出坐标
        int x1 = a / 100, x2 = b / 100;
        int y1 = a % 100, y2 = b % 100;

        // 计算 k 的最简分数
        int up = y1 - y2, down = x1 - x2;
        int div_k = gcd(up, down);//(最大公约数)
        //用纵坐标之差/gcd()算出分数形式的分子,同理用横坐标之差/gcd()算出分数形式的分母
        String K = (up / div_k) + " " + (down / div_k);//用字符串形式表示分数形式的K(斜率)

        //k 不存在时,即 down = 0 的情况,就是两个点的横坐标相等的时候,为一条竖线
        // 此时方程为 x = x1 or x2,都可,因为x1 == x2;
        if (down == 0) {
            ans.add("x = " + x1);
            return;
        }

        // 代入点 (x1, y1) 来计算 kx 和 y 的分数
        // 因为分母都是 down,所以只求分子就好
        //为求得B而铺垫
        int up_kx = up * x1, up_y = y1 * down;

        // 计算 b = y - kx 的最简分数
        int up_b = up_y - up_kx;
        int div_b = gcd(up_b, down);
        String B = (up_b / div_b) + " " + (down / div_b);

        // 加入答案
        ans.add(K + "  " + B);//本身包括去重了
    }
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();

        int x = 19, y = 20;
        for (int i = 0; i <= x; i++) {
            for (int j = 0; j <= y; j++) { 
            	//把每个点,的坐标当成一个数,存在set里边,x坐标i*100,y坐标就是j本身
                set.add(i * 100 + j);
            }
        }

        List<Integer> arr = new ArrayList<>(set);
        int len = arr.size();
        for (int i = 0; i < len; i++) {
            int a = arr.get(i);
            for (int j = i + 1; j < len; j++) {
                int b = arr.get(j);
                //a是一个点,b是相邻的第一个点,第二个点.......到最后一个点
                getKB(a, b);
            }
        }
        System.out.println("ans = " + ans.size());
    }
}

答案:40257

友情链接:12届最全蓝桥javaB组详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值