题目描述
输入一组勾股数 a , b , c ( a ≠ b ≠ c ) a,b,c(a\neq b\neq c) a,b,c(a=b=c),用分数格式输出其较小锐角的正弦值。(要求约分。)
输入格式
一行,包含三个正整数,即勾股数 a , b , c a,b,c a,b,c(无大小顺序)。
输出格式
一行,包含一个分数,即较小锐角的正弦值
1.题目分析
该题主要考查的是,寻找最大最小值,以及最大公约数的计算。
最大公约数有很多计算方法,常见的有辗转相除法,更相减损法,穷举法等。
2.题目思路
循环键入三个值,存入数组后,使用冒泡排序,从小到大,这样0索引就是最小值,2所以就是最大值。
接下来写一个辗转相除的函数gcd,这也是本题的核心:
- 大数除小数 = 余数;
- 写一个while循环,条件为余数不为0;
- 在循环过程中,将小数赋值给大数,余数赋值给小数,值得一提的是,先后赋值的顺序是不允许改变的
- 最后一轮循环中的余数则是要求的最大公约数。
3.代码演示
#include <stdio.h>
int gcd(int m, int n) {
int x;
//大数除小数不为0
while (m % n != 0) {
//得到余数
x = m % n;
//将小数赋值给大数
m = n;
//余数赋值给小数
n = x;
}
//打印更小数
return x;
}
int main() {
int a, s;
int temp;
int arr[3];
//存入数组
for (int i = 0; i < 3; ++i) {
scanf("%d", &a);
arr[i] = a;
}
//冒泡排序
for (int i = 0; i < 3 - 1; ++i) {
for (int j = 0; j < 3 - 1 - i; ++j) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//调用计算最大公约数的函数
s = gcd(arr[2], arr[0]);
printf("%d/%d\n", arr[0] / s, arr[2] / s);
return 0;
}