斜率计算2

描述

现在给出两个点的坐标,要你求出斜率,这个斜率需要用最简分数表示,同时斜率不存在输出-1

输入

输入4个整数 x1,y1,x2,y2.分别是A,B两点的坐标。

输出

输出两点所确定直线的斜率,不存在则输出-1.

输入样例 1 

2 1 0 0

输出样例 1

1/2

这是我写的:

#include<stdio.h>
#include<math.h>

int yue(int a,int b)

{
    int c;
    if(a<b) {
        c = a;
        a = b;
        b = c;                      //确保a≥b
    }
    while(b != 0) {
        c = b;
        b = a%b;                    //辗转相除
        a = c;
    }
    return a;
}
int main()
{

    int X1,Y1,X2,Y2,k,X,Y,Z;

    scanf("%d%d%d%d",&X1,&Y1,&X2,&Y2);

    X=abs(X1-X2);//abc()是绝对值函数
    Y=abs(Y1-Y2);

    if(X==0)
        printf("-1");

    else if(Y%X==0) {
            if(Y==0)
            printf("0");
            else if((X1<X2)&&(Y1<Y2))
            printf("%d",Y/X);
            else  if((X1<X2)||(Y1<Y2))
            printf("-%d",Y/X);//符号的重要性
            else
            printf("%d",Y/X);
         }else if((X1<X2)&&(Y1<Y2)){
            Z=yue(X,Y);
            printf("%d/%d",Y/Z,X/Z);
         }  else if((X1<X2)||(Y1<Y2)) {
            Z=yue(X,Y);
            printf("-%d/%d",Y/Z,X/Z);
    }
    else 
    {
        Z=yue(X,Y);

        printf("%d/%d",Y/Z,X/Z);

    }

        return 0;

}

这是我一个左职的朋友写的:

#include<stdio.h>
int get_Min(int x,int y)//定义函数,取两者中的较小值
{
	if(x>=y)
	{
		return y;
	}
	else
	{
		return x;
	}
}
int main()
{
	int x1,y1,x2,y2;
	scanf("%d %d %d %d",&x1,&y1,&x2,&y2);//读入四个值
	int up = y2-y1;                      //表示分子
	int down = x2-x1;                    //表示分母
	int flag = 0;                        //正负号标记符
	if(up<0)   //无论如何,分子要正数,这一步很关键
	{
		flag++;//此时flag不等于0,表示我的分子变化(取正)过了
		up = -up;
	}
	if(down<0)  //无论如何,分母也要正数,这一步很关键
	{
		flag--;  //此时flag回归0,表示分子分母都变化(取正)过了
		down = -down;
	}
    lable:  //"递归"标签
	if(down == 1&&up != 0)   //五条if else语句,分别检验特殊情况
	{
		printf("%d",up);
	}
    else if(down == 1)
    {
      	printf("0");
    }
	else if(down == -1&&up != 0)
	{
		printf("%d",up*(-1));
	}
  	else if(down == -1)
    {
     	printf("0");
    }
    else if(down == 0)
    {
    	printf("-1");
    }
	else
	{
		for(int i=2;i<=get_Min(up,down);i++)  //为约分准备公因数,公因数最大可以取得分子或者分母的较小值,此方法过程比较麻烦(但是思路简单)
		{
			if(up%i==0&&down%i==0&&down>1&&up>1)//满足公因数,并且分子分母大于1,如果小于等于1,应该在前面作为特殊情况处理
			{                                   //选择1作为“特殊”的临界的原因,是因为我的i最小从2开始,i=1时死循环
				up /= i;
				down /= i;
				goto lable;       //虚假的递归
			}
		}
		if(flag != 0)             //前面调整过正负号,在这里检验是不是需要补上一个负号
		{
			printf("-");
		}
		printf("%d/%d",up,down);
	}
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值