题目:
给出三个坐标 (xi,yi) (xi,yi∈Z),求出二次函数的分数式方程。
如果无解,输出No answer!
例如:
输入:
1 1
3 5
-2 7
输出:
f(x)=(4/5)x^2-(6/5)x+(7/5)
解析:这是一道和数学有关的题目,只要有思路 难度应该不大,但是重点是以分数的形式表示,如果你是用小数求出来的,精度是受限制的,所以,需要另辟蹊径
如果你想到了线性代数,那么这道题会很好做
运用 克莱默法则 即可:
代码C:
运行结果:
# include <stdio.h>
# define N 3
# define ABS(x) (x>=0?x:-x)
# define YiHao(a,b) ((a)>0&&(b)<0||(a)<0&&(b)>0)
void change(long long *a,long long *b)//交换 a b的值
{
long long c=*a;
*a=*b;
*b=c;
}
long long gcd(long long x,long long y)//返回 x y的最大公因数
{
long long a;
if(!y)return x;
while(a=x%y)
(x=y)&&(y=a);
return y;
}
long long Dsum(long long A[][N])//返回N阶行列式的值
{
long long i,sum=0;
for(i=0; i<N; i++)//求D的值
sum+=A[i][0]*A[(i+1)%N][1]*A[(i+2)%N][2] - A[i][2]*A[(i+1)%N][1]*A[(i+2)%N][0];
return sum;
}
long long A[N][N];
long long D[N][2],X[N],Y[N];
long long i,j,k,sum;
int main()
{
while(1)
{
for(i=0; i<N; i++)
{
printf("输入第%d个点x y:",i+1);
scanf("%lld%lld",&D[i][0],&D[i][1]);//输入点
A[i][0]=D[i][0]*D[i][0];//求D 行列式
A[i][1]=D[i][0];
A[i][2]=1;
}
sum=Dsum(A);//求行列式A的值
if(sum)
{
printf("\nf(x)=");
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
change(&A[j][i],&D[j][1]);//将D的第二行的 点Yi 的值与A[][]中的第j列 交换
X[i]=Dsum(A);//求交换第i列之后的行列式A的值
for(j=0; j<N; j++)//交换回来 恢复A值
change(&A[j][i],&D[j][1]);
Y[i]=gcd(sum,X[i]);//求sum 和X[i] 的最大公因数
X[i]/=Y[i];//
Y[i]=sum/Y[i];//将此分数 化为最简 得到分数 X[i]/Y[i]
}
if(X[0]) //输出二次项系数
{
if(YiHao(X[0],Y[0]))printf("-");//输出系数的符号
if(Y[0]!=1&&X[0]!=Y[0])
printf("(%lld/%lld)",ABS(X[0]),ABS(Y[0]));
else if(X[0]!=1)printf("%lld",ABS(X[0]));
printf("x^2");
}
if(X[1])
{
if(YiHao(X[1],Y[1]))printf("-");//输出系数的符号
else if(X[0])printf("+");
if(Y[1]!=1&&X[1]!=Y[1])
printf("(%lld/%lld)",ABS(X[1]),ABS(Y[1]));
else if(X[1]!=1)printf("%lld",ABS(X[1]));
printf("x");
}
if(X[2])
{
if(YiHao(X[2],Y[2]))printf("-");//输出系数的符号
else if(X[0]||X[1]) printf("+");
if(Y[2]!=1&&X[2]!=Y[2])
printf("(%lld/%lld)",ABS(X[2]),ABS(Y[2]));
else printf("%lld",ABS(X[2]));
}
if(!X[0]&&!X[1]&&!X[2])printf("0");
printf("\n");
}
else printf("No answer!\n");
}
return 0;
}