前天在洛谷发现了一题:
求一次函数解析式
初中数学和程序的结合,我觉得挺有趣的
贴出代码:
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则为负数……
没什么好说的,作为小白,写到这里吧,感觉不太完善,洛谷输入的应该都是整数