请你用C写一个用户输入三点坐标求出抛物线解析式的程序,解析式中系数若有小数要化成分数
时间: 2023-05-26 16:03:47 浏览: 123
分析:
抛物线的解析式为 $y=ax^2+bx+c$,需要求出系数 $a,b,c$。
三点坐标可以确定三元一次方程组,解方程组可以求出系数。
具体实现:
1. 输入三点的坐标;
2. 根据三点坐标列出方程组;
3. 通过消元法解出系数;
4. 将系数化为最简分数形式,输出解析式。
代码:
```c
#include <stdio.h>
//求最大公约数
int gcd(int x, int y) {
if(y == 0)
return x;
else
return gcd(y, x % y);
}
int main() {
int x1, y1, x2, y2, x3, y3;
int a, b, c; //系数
printf("请输入三个点的坐标,格式为:x y,如:0 0\n");
scanf("%d %d", &x1, &y1);
scanf("%d %d", &x2, &y2);
scanf("%d %d", &x3, &y3);
//列方程组
int A = x1 * x1;
int B = x1;
int C = 1;
int D = x2 * x2;
int E = x2;
int F = 1;
int G = x3 * x3;
int H = x3;
int I = 1;
int fx1 = y1;
int fx2 = y2;
int fx3 = y3;
//消元
int det = A*E*I + B*F*G + C*D*H - C*E*H - B*D*I - A*F*G;
a = (fx1*(E*I-H*F) + fx2*(G*F-D*I) + fx3*(D*H-E*G)) / det;
b = (fx1*(C*H-B*I) + fx2*(A*I-C*G) + fx3*(B*G-A*H)) / det;
c = (fx1*(B*F-C*E) + fx2*(C*D-A*F) + fx3*(A*E-B*D)) / det;
//将系数化为最简分数形式
int gcd_ab = gcd(a,b);
int gcd_abc = gcd(gcd_ab,c);
a /= gcd_abc;
b /= gcd_abc;
c /= gcd_abc;
printf("抛物线解析式为:y=");
if(a != 1)
printf("%d", a);
printf("x^2");
if(b < 0)
printf("%d/%d", b, -gcd(b,c));
else if(b > 0)
printf("+%d/%d", b, gcd(b,c));
if(c < 0)
printf("%d/%d", c, -c);
else if(c > 0)
printf("+%d/%d", c, c);
printf("\n");
return 0;
}
```
注意事项:
1. 在输出解析式时,系数若为正则要加上正号,负数则无需加负号。
2. 输出系数时需要将分子和分母的最大公约数化为1。
3. 当系数为0时,不应该输出对应的项。
阅读全文