给出三个坐标 (xi,yi) (xi,yi∈Z),求出二次函数的分数式方程。

题目:

给出三个坐标 (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;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值