①题目:
力扣1447. 最简分数https://leetcode-cn.com/problems/simplified-fractions/
②代码:
//要想分数最简,则分子和分母的最大公因数必定为1,即两个数互质,通过辗转相除法可判断。
class Solution {
public List<String> simplifiedFractions(int n) {
//n为1跳过判断,直接返回。
if (n==1) {
return new ArrayList<String>();
}
List<String> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
if (judge(i,j)) {
// list.add(j+"/"+i);略慢
StringBuilder sb=new StringBuilder();
sb.append(j);
sb.append('/');
sb.append(i);
list.add(sb.toString());
}
}
}
return list;
}
//辗转相除法判断两个数是否互质。
public boolean judge(int a,int b){
while (true){
//a,b按大小输入
int temp=a%b;
if (temp==0)
break;
else{
a=b;
b=temp;
}
}
return (b==1)?true:false;
}
}
③结果:
补充:
最大公因数(gcd)【递归+非递归】:
public static int gcd(int a, int b) {
// 辗转相除法
int max = a > b ? a : b;
int min = a < b ? a : b;
if (max % min == 0)
return min;
return gcd(max % min, min);
}
public static int gcd(int a, int b) {
// 辗转相除法
int max = a > b ? a : b;
int min = a < b ? a : b;
while (true){
int temp=a%b;
if (temp==0)
break;
else{
a=b;
b=temp;
}
}
return b;
}
最小公倍数(lmc):
public static int lmc(int a,int b){
//最小公倍数:两数之积除以最大公倍数即可!
return a*b/gcd(a,b);