洛谷P1888三角函数题目解法

首先声明:本人是菜鸡,不喜勿喷,有问题恳请大佬指正

题目描述如下:

输入一组勾股数 a,b,c(a≠b≠c),用分数格式输出其较小锐角的正弦值。(要求约分。)

输入格式

一行,包含三个正整数,即勾股数a,b,c(无大小顺序)。

输出格式

一行,包含一个分数,即较小锐角的正弦值

输出较小锐角的三角函数即符合勾股定理的三边中最短边比最长边,题目要求约分,因此需要自定义gcd函数对其进行约分

先写好环境

#include<bits/stdc++.h>
using namespace std;
int main(){




return 0;
}

下面要求出符合勾股定理中三边的最长边的值和最短边的值

思路:

定义一个最大值和最小值,通过分别将数字与极值相比较,不断刷新极值的上线和下线来求出最值

    int a,b,c;
	int min = 1e9;
	int max = -1e9; 
	cin>>a>>b>>c;
	if(a*a+b*b==c*c||c*c+a*a==b*b||a*a==b*b+c*c){	
	//最小值 
	if(a<min){
		min = a;
	if(b<min){
		min = b;
	}
	if(c<min){
		min = c;
	}
	}
	//最大值
	if(a>max){
		max = a;
	if(b>max){
		max = b;
	}
	if(c>max){
		max = c;
	}
	}

两个极值求出后需要对其进行约分:此时需要在主函数上方自定义一个gcd函数:

此处gcd为常速写法

inline int gcd(int a,int b){    
        int r;    
    while(b>0){        
        r=a%b;        
        a=b;        
        b=r;    
     }   
      return a;
}

更为快速的写法可以用到三目运算符:

inline int gcd(int a,int b){    
	return b>0 ? gcd(b,a%b):a; 
}

其含义大致为:

if(b>0){
    gcd(b,a%b);
       }else{
    a;
        }

最终再将所得最值分别除以其最大公约数即可:

int z = gcd(max,min);
	 cout<<min/z<<"/"<<max/z;
	}

完事!

下面是全部代码:

#include<bits/stdc++.h>
using namespace std;
//快速取最大公约数     知识:三目运算符。 
	inline int gcd(int a,int b){    
 	return b>0 ? gcd(b,a%b):a;
    }

	//说明: 
	//b>0 ? gcd(b,a%b):a;
	//即:if(b>0){ 
	//		gcd(b,a%b);
	//			}else{
	//		a;		
	//			}

//常速取最大公约数的方法 
//inline int gcd(int a,int b) 
//{    
//    int r;    
//    while(b>0)
//    {        
//        r=a%b;        
//        a=b;        
//        b=r;    
//    }    
//    return a;
//}
int main()
{
	int a,b,c;
	int min = 1e9;
	int max = -1e9; 
	cin>>a>>b>>c;
	if(a*a+b*b==c*c||c*c+a*a==b*b||a*a==b*b+c*c){	
	//最小值 
	if(a<min){
		min = a;
	if(b<min){
		min = b;
	}
	if(c<min){
		min = c;
	}
	}
	//最大值
	if(a>max){
		max = a;
	if(b>max){
		max = b;
	}
	if(c>max){
		max = c;
	}
	}
	//求最大公约数 
	int z = gcd(max,min);
	 cout<<min/z<<"/"<<max/z;
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值