时间:2021/03/07
一.题目描述
给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。
输入描述
每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000。
输出描述
每行输出最简真分数组合的个数。
题目链接
https://www.nowcoder.com/practice/1f1db273eeb745c6ac83e91ff14d2ec9?
tpId=40&tqId=21366&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey
二.算法
题解
从输入示例我们可以看出,存在组中个数为0的情况,这时我们要在输入后对n进行判断,若n为0,则不进行输出。然后就是求最简真分式的个数,这里采用的是穷举的方法,即对每一组可能的分式都要通过欧几里得算法判断是否存在最大公约数,若最大公约数为1则不存在,不为1则存在。
代码
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ //读取输入 int n = in.nextInt(); if(n != 0){ int[] num = new int[n]; for(int i = 0; i < n; i++){ num[i] = in.nextInt(); } //计算最简真分数的个数 int count = 0; for(int i = 0; i < n - 1; i++){ for(int j = i + 1; j < n; j++){ if(num[i] < num[j]){ if(gcd(num[j], num[i]) == 1){ count++; } }else if(num[i] > num[j]){ if(gcd(num[i], num[j]) == 1){ count++; } } } } System.out.println(count); } } } //使用欧几里得算法求最大公约数 public static int gcd(int a, int b){ if(b == 0){ return a; }else{ return gcd(b, a % b); } } }