题解 P2026 【求一次函数解析式】

· · 题解

个人的代码还是有些问题。就是没考虑x,y分数情况。当然题目也没要求考虑。。

另外题目也有点问题。先看下给的样例输出

【一】

y=2x 【二】

y=-2x+11

【三】

y=-1/2*x+1/2

第三个x之前带*号,而其他输出不带,最好一起带或都不带

不过还是很感谢出题者。下面晒出我的代码,还请各位多多指教哈

#include <stdio.h>
int main()
{
    int k,b = 0;
    int x1,y1,x2,y2 = 0;
    scanf("%d %d",&x1,&y1);
    scanf("%d %d",&x2,&y2);
//    y2 - y1 = (x2-x1)k      上下相减,消去b,这样就是一元一次方程了 
//    b = y - kx          已知k,算b,同样是一元一次方程 
    k = (y2-y1)/(x2-x1);  //算k 
    b = y1 - k*x1;//算b  
    //下面是进行分数判断 
    if((y2-y1)/(x2-x1)*(x2-x1) != (y2-y1)) //证明k是分数 (k是分数b一定是分数,详见上面计算式 ) 
    {
//        (y2-y1)/(x2-x1) //此时打印的y值 
//        b=y1-(y2-y1)/(x2-x1)*x1;           //此时b的计算式 
//        b = (y1*(x2-x1) - (y2-y1)*x1)/(x2-x1) //通分,分子一定是整数,分母一定也是整数 
        int mid = (y1*(x2-x1) - (y2-y1)*x1);
        int y = y2 - y1;
        int x = x2 - x1; 
        if(((y1*(x2-x1) - (y2-y1)*x1)/(x2-x1)) > 0)//依旧要判断b的事情 
        { 
            printf("y=%d/%d*x%d/%d",y,x,mid,x);
            return 0; 
        }
        printf("y=%d/%d*x%d/%d",y,x,mid,x);
        return 0;
    }
      if(b > 0)
    {
        printf("y=%dx+%d",k,b);
        return 0;
    }
    if(b == 0)
    {
        printf("y=%dx",k);
        return 0;
    }
    printf("y=%dx%d",k,b);
        return 0;
}

分两个部分,一个部分判断分数,一个整数。整数很easy,直接算就完了。区分分数整数就是利用c语言除法的舍位,就是非四舍五入,导致分数除的时候再乘回来不等于之前的数。例如20除以15,得数是1,乘15是15,15!=20.可以利用这个判断分数。 然后就是判断正负数了。这个简单

然后还有打印,打印就把分数分两部分去打,分子一部分,分母一部分。

其他详细注释代码里有了。还望指教。