首先声明:本人是菜鸡,不喜勿喷,有问题恳请大佬指正
题目描述如下:
输入一组勾股数 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;
}