记录黑历史:java洛谷P2026 求一次函数解析式

前天在洛谷发现了一题:

求一次函数解析式

初中数学和程序的结合,我觉得挺有趣的
一次函数解析式

贴出代码:

import java.util.Scanner;


public class Main {
    
    
    public static void main(String args[]) {
    
    
        Scanner scanner = new Scanner(System.in);
        double x1,x2,y1,y2;
        x1= scanner.nextDouble();
        y1= scanner.nextDouble();
        x2= scanner.nextDouble();
        y2= scanner.nextDouble();
        String ks="";
        String cs;
        double k1=(y1-y2);
        double k2=(x1-x2);
        double c1=-1*x2*y1+x1*y2;
        if(k1/k2<0)
           ks="-";
        if(c1/k2<0)
            cs="-";
        else if(c1/k2==0)
            cs="";
        else
            cs="+";
        k1=Math.abs(k1);
        k2=Math.abs(k2);
        c1=Math.abs(c1);
        if(k2==1)
            ks+=(int)k1;
        else
        {
    
    
            if(k1%k2==0)
                ks+=(int)(k1/k2);
            else
            ks+=(int)k1+"/"+(int)k2+"*";
        }

        if(k2==1&&c1!=0)
            cs+=(int)c1;
        if(k2!=1&&c1!=0)
        {
    
    
            if(c1%k2==0)
                cs+=(int)(c1/k2);
            else
                cs+=(int)c1+"/"+(int)k2;
        }


        System.out.println("y="+ks+"x"+cs);

    }
}

解题的细节:

  • 必须考虑分数的存在,程序计算的话直接就小数了
  • 必须考虑符号,负数的正确位置,k不为负数时符号忽略,c为0时省略不写
  • y=k·x+c中c为0时省略不写
  • 分数时,若6/2这样的分数,要化成3
  • c的分母不考虑为0时,分子为0,c为0,c省略不写
  • 整数*x时:乘号省略不写,例如:2x

没做的细节:

  • 如果某个解不为整数,可能就gg了
  • 没考虑k为0的时候……

解题思路:

由于有分数的存在,所以只能将k和c用x和y去代入分式里
公式:
k=(y1 - y2) / (x1 - x2)
c=(-1 * x2 * y1 + x1 * y2 )/ (x1-x2)
这样就可以通过两个xy求出k和c了

公式的由来:

用联立消元法可求出k,把k的公式代入c式中可求出c

至于斜率点斜,都是我后面才想起来的,我的第一感受就是消元(老学渣了)

符号的判定:

直接由分子除以分母,如果商小于0则为负数……

没什么好说的,作为小白,写到这里吧,感觉不太完善,洛谷输入的应该都是整数

猜你喜欢

转载自blog.csdn.net/weixin_44655368/article/details/114210352