Python算法100例-4.2 列出真分数序列

完整源代码项目地址,关注博主私信'源代码'后可获取

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%j0)不成立,则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):                  # 穷举40以内的全部分子
        num1 = 40                                   # 分母
        num2 = i                            # 分子
        # 采用辗转相除法求出分子与分母的最大公约数
        while num2 != 0:
            temp = num1 % num2
            num1 = num2
            num2 = temp
        if num1 == 1:                       # 若最大公约数为1,则为最简真分数
            n += 1
            print("%2d/40 " %i, end=" ")
            if n % 8 == 0:                  # 每8个一行
                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):                  # 穷举40以内的全部分子
        num1 = 40                           # 分母
        num2 = i                            # 分子
        j =2
        while j <= num2:
            # 判断2~num2之间分子和分母是否有公约数
            # 如果有j满足条件,则结束循环,说明此时的分数不是最简分数
            if (num1 % j == 0) and (num2 % j == 0):
                break
            j += 1
        # 如果j > num2,说明2~num2之间没有分子和分母的公约数,分数为最简分数
        if j > num2:
            print("%2d/40  " %i, end=" ")
            n += 1
            if n % 8 == 0:                  # 每行输出8个数
                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):            # 穷举40以内的全部分子
            num2 = i                                # 分子
            j = 2
            while j <= num2:
                # 判断2~num2之间分子和分母是否有公约数
                # 如果有j满足条件,则结束循环,说明此时的分数不是最简分数
                if (num1 % j == 0) and (num2 % j == 0):
                    break
                j += 1
            # 如果j > num2,说明2~num2之间没有分子和分母的公约数,分数为最简分数
            if j > num2:
                print("%2d/%2d " %(num2,num1) , end=" ")
                n += 1
                if n % 10 == 0:             # 每行输出8个数
                    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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘逸高铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值