这篇文章讲述的是算法趣味分数部分的列出真分数序列问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
按递增顺序依次列出所有分母为40,分子小于40的最简分数。最简分数是分子、分母只有公因数1的分数叫最简分数或者说分子分母互质的分数是最简分数。
算法分析
- 先穷举出分子的所有情况,再判断出每种情况是否满足条件:分子分母的最大公约数为1
- 时间复杂度:O(n*log n) , 空间复杂度:O(1)
代码实现
package fraction;
/**
* @author 叶清逸
* @date 2018年7月28日下午9:57:52
* @version 1.0
* @project fraction
*/
public class Q5_TrueFractionSequence {
/**
* 问题描述:按递增顺序依次列出所有分母为40,分子小于40的最简分数。最简分数是分子、分母只有公因数1的分数叫最简分数或者说
* 分子分母互质的分数是最简分数。
*
* 算法分析:先穷举出分子的所有情况,再判断出每种情况是否满足条件:分子分母的最大公约数为1
*
* 复杂度分析:时间复杂度:O(n*log n) , 空间复杂度:O(1)
*/
public static void main(String[] args) {
int num = 0 ;
/*循环判断1-40每种情况是否符合要求*/
for(int i=1 ; i<40 ; i++){
/*辗转相除求出i和40的最大公约数*/
int b = 40 ;
int a = i ;
while(b%a != 0){
//k保存余数
int k = b%a ;
//除数变为
b = a ;
//被除数变为余数
a = k ;
}
int gcd = a;
/*若最大公约数为1则满足条件,输出*/
if(gcd == 1){
System.out.print(i+"/"+40+" ");
num++ ;
/*每8个换一行*/
if(num%8 == 0)
System.out.println();
}
}
System.out.println("共"+num+"个");
}
}
样例输出
1/40 3/40 7/40 9/40 11/40 13/40 17/40 19/40
21/40 23/40 27/40 29/40 31/40 33/40 37/40 39/40
共16个