完整源代码项目地址,关注博主私信'源代码'后可获取
1.问题描述 2.问题分析 3.算法设计 4.确定程序框架 5.完整的程序 6.拓展训练
1.问题描述
按递增顺序依次列出所有分母为40、分子小于40的最简分数。
2.问题分析
分子和分母只有公因数1的分数,或者说分子和分母是互质数的分数,叫作最简分数,又称既约分数。如2/3、8/9、3/8等就是最简分数。
方法1:求分子小于40的最简分数,可以对分子采用穷举的方法。根据最简分数的定义可知,分子和分母的最大公约数为1,因此可以利用最大公约数的方法,判定分子与40是否构成真分数。
方法2:分子和分母的公因数只有1的分数为最简分数,若分子和分母在1~分子(num2)
3.算法分析
变量num1、num2分别用于存储分母和分子的值。
方法1:
求最大公约数一般采用辗转相除的思想,具体步骤概括如下:
1)用较大的数num1除以较小的数num2,得到的余数存储到变量temp中,即temp=num1%num2。
2)用较小的除数num2和得出的余数temp构成新的一对数,并分别赋值给num1和num2,继续做上面的除法。
3)当num2为0时,num1就是最大公约数;否则重复步骤1和步骤2。
对于辗转相除法的思想将在4.4节详细说明,此处先跳过。
方法2:
分数的分子仍然采用穷举法。对于每一个可能的分子,都要判断在1~num2范围内分数num1/num2除了1之外是否有其他的公因数,循环初值为2。
在2~num2内若有一个数j能同时整除分子、分母,说明此分数不是最简分数,j~num2之间的数也无须再判断,利用break语句结束循环,循环结束时j<num2。循环过程中若没有一个数可以同时整除分子和分母,即条件if(num1%j0)and(num2%j 0)不成立,则break语句不执行,循环正常结束,即条件j≤num2不成立,循环结束时j>num2。利用j与num2的大小关系可判断分数是否为最简分数。
4.确定程序框架
辗转相除法求最大公约数的流程图见4.4节,下面给出方法2的流程图,如图4.4所示。
5.完整的程序
代码1(对应方法1):
if __name__ == "__main__" :
print ( "分母为40,分子小于40的最简分数有:" )
n = 0
for i in range ( 1 , 40 ) :
num1 = 40
num2 = i
while num2 != 0 :
temp = num1 % num2
num1 = num2
num2 = temp
if num1 == 1 :
n += 1
print ( "%2d/40 " % i, end= " " )
if n % 8 == 0 :
print ( )
分母为40,分子小于40的最简分数有:
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
代码2(对应方法2):
if __name__ == "__main__" :
print ( "分母为40,分子小于40的最简分数有:" )
n = 0
for i in range ( 1 , 40 ) :
num1 = 40
num2 = i
j = 2
while j <= num2:
if ( num1 % j == 0 ) and ( num2 % j == 0 ) :
break
j += 1
if j > num2:
print ( "%2d/40 " % i, end= " " )
n += 1
if n % 8 == 0 :
print ( )
分母为40,分子小于40的最简分数有:
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
6.拓展训练
按递增顺序依次列出所有分母小于等于40的最简真分数。
根据问题描述进行分析后可知,求分母为40、分子小于40的最简分数的算法如上所述;当分母为30,求分子小于30的最简分数思想与上述思想相同,只需将num1的值改为30;分母为39,38,37,…,1时,最简分数也都可用上述方法求得。因此,要求分母小于等于40的最简真分数,只需在上述程序的基础上加一个外层循环来控制分母的取值即可,即添加循环“for k in range(1,40+1)”。
代码如下:
if __name__ == "__main__" :
print ( "分母小于等于40的最简分数有:" )
for k in range ( 1 , 40 + 1 ) :
num1 = k
n = 0
for i in range ( 1 , num1) :
num2 = i
j = 2
while j <= num2:
if ( num1 % j == 0 ) and ( num2 % j == 0 ) :
break
j += 1
if j > num2:
print ( "%2d/%2d " % ( num2, num1) , end= " " )
n += 1
if n % 10 == 0 :
print ( )
print ( )
分母小于等于40的最简分数有:
1/ 2
1/ 3 2/ 3
1/ 4 3/ 4
1/ 5 2/ 5 3/ 5 4/ 5
1/ 6 5/ 6
1/ 7 2/ 7 3/ 7 4/ 7 5/ 7 6/ 7
1/ 8 3/ 8 5/ 8 7/ 8
1/ 9 2/ 9 4/ 9 5/ 9 7/ 9 8/ 9
1/10 3/10 7/10 9/10
1/11 2/11 3/11 4/11 5/11 6/11 7/11 8/11 9/11 10/11
1/12 5/12 7/12 11/12
1/13 2/13 3/13 4/13 5/13 6/13 7/13 8/13 9/13 10/13
11/13 12/13
1/14 3/14 5/14 9/14 11/14 13/14
1/15 2/15 4/15 7/15 8/15 11/15 13/15 14/15
1/16 3/16 5/16 7/16 9/16 11/16 13/16 15/16
1/17 2/17 3/17 4/17 5/17 6/17 7/17 8/17 9/17 10/17
11/17 12/17 13/17 14/17 15/17 16/17
1/18 5/18 7/18 11/18 13/18 17/18
1/19 2/19 3/19 4/19 5/19 6/19 7/19 8/19 9/19 10/19
11/19 12/19 13/19 14/19 15/19 16/19 17/19 18/19
1/20 3/20 7/20 9/20 11/20 13/20 17/20 19/20
1/21 2/21 4/21 5/21 8/21 10/21 11/21 13/21 16/21 17/21
19/21 20/21
1/22 3/22 5/22 7/22 9/22 13/22 15/22 17/22 19/22 21/22
1/23 2/23 3/23 4/23 5/23 6/23 7/23 8/23 9/23 10/23
11/23 12/23 13/23 14/23 15/23 16/23 17/23 18/23 19/23 20/23
21/23 22/23
1/24 5/24 7/24 11/24 13/24 17/24 19/24 23/24
1/25 2/25 3/25 4/25 6/25 7/25 8/25 9/25 11/25 12/25
13/25 14/25 16/25 17/25 18/25 19/25 21/25 22/25 23/25 24/25
1/26 3/26 5/26 7/26 9/26 11/26 15/26 17/26 19/26 21/26
23/26 25/26
1/27 2/27 4/27 5/27 7/27 8/27 10/27 11/27 13/27 14/27
16/27 17/27 19/27 20/27 22/27 23/27 25/27 26/27
1/28 3/28 5/28 9/28 11/28 13/28 15/28 17/28 19/28 23/28
25/28 27/28
1/29 2/29 3/29 4/29 5/29 6/29 7/29 8/29 9/29 10/29
11/29 12/29 13/29 14/29 15/29 16/29 17/29 18/29 19/29 20/29
21/29 22/29 23/29 24/29 25/29 26/29 27/29 28/29
1/30 7/30 11/30 13/30 17/30 19/30 23/30 29/30
1/31 2/31 3/31 4/31 5/31 6/31 7/31 8/31 9/31 10/31
11/31 12/31 13/31 14/31 15/31 16/31 17/31 18/31 19/31 20/31
21/31 22/31 23/31 24/31 25/31 26/31 27/31 28/31 29/31 30/31
1/32 3/32 5/32 7/32 9/32 11/32 13/32 15/32 17/32 19/32
21/32 23/32 25/32 27/32 29/32 31/32
1/33 2/33 4/33 5/33 7/33 8/33 10/33 13/33 14/33 16/33
17/33 19/33 20/33 23/33 25/33 26/33 28/33 29/33 31/33 32/33
1/34 3/34 5/34 7/34 9/34 11/34 13/34 15/34 19/34 21/34
23/34 25/34 27/34 29/34 31/34 33/34
1/35 2/35 3/35 4/35 6/35 8/35 9/35 11/35 12/35 13/35
16/35 17/35 18/35 19/35 22/35 23/35 24/35 26/35 27/35 29/35
31/35 32/35 33/35 34/35
1/36 5/36 7/36 11/36 13/36 17/36 19/36 23/36 25/36 29/36
31/36 35/36
1/37 2/37 3/37 4/37 5/37 6/37 7/37 8/37 9/37 10/37
11/37 12/37 13/37 14/37 15/37 16/37 17/37 18/37 19/37 20/37
21/37 22/37 23/37 24/37 25/37 26/37 27/37 28/37 29/37 30/37
31/37 32/37 33/37 34/37 35/37 36/37
1/38 3/38 5/38 7/38 9/38 11/38 13/38 15/38 17/38 21/38
23/38 25/38 27/38 29/38 31/38 33/38 35/38 37/38
1/39 2/39 4/39 5/39 7/39 8/39 10/39 11/39 14/39 16/39
17/39 19/39 20/39 22/39 23/39 25/39 28/39 29/39 31/39 32/39
34/39 35/39 37/39 38/39
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