题解 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.可以利用这个判断分数。 然后就是判断正负数了。这个简单
然后还有打印,打印就把分数分两部分去打,分子一部分,分母一部分。
其他详细注释代码里有了。还望指教。