P1888 三角函数

题目描述

输入一组勾股数 a , b , c ( a ≠ b ≠ c ) a,b,c(a\neq b\neq c) a,b,ca=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;
}

你可能感兴趣的:(刷题go,go,go,算法,数据结构)