// 输入两个坐标,求经过两坐标的直线方程
func Fx(x1, y1, x2, y2 int) string {
if x1 == x2 && y1 == y2 { // 两个相同坐标,直接输出坐标值
return "(" + strconv.Itoa(x1) + "," + strconv.Itoa(y1) + ")"
}
if x1 == x2 { //x坐标相同,直线垂直于x轴
return "x=" + strconv.Itoa(x1)
}
if y1 == y2 { //y坐标相同,直线垂直y轴
return "y=" + strconv.Itoa(y1)
}
a1, a2, _ := HuaJian(y1-y2, x1-x2) //计算斜率a:(x1-x2)/(y1-y2),分数表示:a1/a2
b1, b2, _ := HuaJian(y1*a2-a1*x1, a2) //常数项分数表示:b1/b2
f1 := strconv.Itoa(a1) + "/" + strconv.Itoa(a2) // a分母存在时
f2 := "+"
f3 := "/" + strconv.Itoa(b2) // b分母存在时候
if a2 == 1 { // a分母等于1,不显示a分母
f1 = strconv.Itoa(a1)
}
if a1 == a2 { // x系数为1时,不显示
f1 = ""
} else if a1 == -1 && a2 == 1 { // x系数为-1时,只显示负号
f1 = "-"
}
if b1 == 0 { // 常数项为0时
return "y=" + f1 + "x"
}
if b2 == 1 { // b分母等于1,不显示b分母
f3 = ""
}
if b1 < 0 { // b为负数时候不显示+
f2 = ""
}
return "y=" + f1 + "x" + f2 + strconv.Itoa(b1) + f3
}
// 整数形式分数化简:a/b,a、b均为整数
func HuaJian(a, b int) (int, int, error) {
var c int // 定义中间变量,用于循环整除最大值,也就是a,b中的最小数
f := 1 // 结果的正负统一管理
if a < 0 && b > 0 { // 结果为负数时,a、b统一调整为正数
a = -a
f = -1
} else if a > 0 && b < 0 { // 结果为负数时,a、b统一调整为正数
b = -b
f = -1
} else if a < 0 && b < 0 { // 结果为正数时,a、b统一调整为正数
a = -a
b = -b
}
if b == 0 { // 分母为0时,返回-1,-1,错误
return -1, -1, fmt.Errorf("分母不能为0!")
} else if a == 0 { // 分子为0时,结果为0,1
return 0, 1, nil
}
if a == b { // a=b时,返回
return f * 1, 1, nil
} else if a < b { // 将a,b最小数复制给中间变量c
c = a
} else {
c = b
}
for i := 2; i <= c; i++ { // 从2开始进行整除
if b%i == 0 { // b能整除
if a%i == 0 { // a能被整除
b = b / i // b约分
a = a / i // a约分
}
}
}
return f * a, b, nil // 返回
}