Logo

郎哥编程

编程案例——找出自然数n的所有因数

2020-04-09 334

阿萌需要编写一个找出自然数n所有因数程序,帮助学生掌握因数概念。

01.png

阿萌要编写找出自然数n所有因数的程序,需要先了解什么是因数?

如果把12写成两个数相乘的形式,有多少种写法呢?

02.png

从上图可以看出,12可以表示成12和1相乘,也可以表示成3和4相乘,也可以表示成2和6相乘。

12、1、3、4、2、6这些乘数都是12的因数。再仔细观察,还能发现一个规律,就是12都能被它的因数整除。

03.png

如果要找出18的因数有哪些数,用什么方法找呢?

可以将18写成两个数相乘的形式,把两个数相乘都等于18的所有算式都列出来,每个算式的乘数不能相同。最后列出的所有乘数就是18的因数。

04.png

使用这种方法虽然可以找出一个数的所有因数,但这种方法需要列出所有两个数相乘等于这个数的算式,没有规律可循,也不适合于让计算机使用这种方法来找一个数的所有因数。

前面我们已经知道了一个数能被这个数所有的因数整除。如果我们从自然数1开始去除这个数,然后顺序用2、3,、……去除这个数,一直到这个数为止,如果这个数能被整除,则除数就是这个数的因数。

05.png

用上面的方法找18的因数就比较容易找了,首先用1除18结果是18,18能够被1整除,1是18的因数。然后再用2除18结果是9,18能被2整除,2也是18的因数。继续用3除18结果是6,18能被3整除,3也是18的因数。以此类推,一直到18除18结果是1,18能被18整除,18也是18的因数。

有了找因数的方法,阿萌就开始考虑找因数的算法了。

阿萌的思路是这样的,创建一个空的列表,然后使用一个for循环,循环范围为1至自然数n,在每轮循环中,用循环的计数变量去除自然数n,如果自然数n能被计数变量整除,说明这个计数变量是自然数n的因数,把因数添加到列表。循环完成后,列表中的元素就是自然数n的所有因数。

阿萌把找因数的算法用函数来实现,函数名称为factor,factor函数有一个参数,该参数为自然数n。当其它代码调用factor函数时,需要传入自然数n,函数执行完成后会返回一个列表,该列表的元素为自然数n的所有因数。

阿萌绘制了factor函数的流程图。

06.png



factor函数的代码。


# 定义函数factor
def factor(n):
    # 创建一个空的list
    num_list = []
    for i in range(1,n+1):
        # 若n被i整除,i是n的因数
        if n % i == 0:
            # i添加到list
            num_list.append(i)
    return num_list

代码解读

factor函数的功能是找出自然数n的所有因数,自然数n在代码调用函数时传入。函数执行完成会返回一个列表,该列表的元素就是自然数n的因数。

在factor函数内部,会先创建一个空的num_list列表,用于存储自然数n的所有因数。然后使用range函数创建一个整数序列,该序列的范围为自然数1~n,for循环在该整数序列内循环,在每一轮循环中,判断自然数n能否被for循环的计数变量i整除,如果自然数n能被i整除,说明i是自然数n的因数,将计数变量i添加到num_list列表。

确定了找自然数n所有因数的函数,阿萌开始梳理编程任务的整体需求。

程序启动后,程序在Shell窗口输出提示信息“请输入一个自然数,输入quit可退出程序:”,学生输入一个自然数,程序找出该自然数的所有因数,并将所有因数输出到Shell窗口。程序再次输出“请输入一个自然数:”,等待学生的下次输入。

程序需要判断学生输入的是否是自然数,如果不是自然数,再判断是否是quit,若是quit退出程序,否则程序输出错误提示“输入错误,请输入一个自然数或者输入quit退出程序”。

阿萌根据上面的功能描述,绘制了程序流程图。

07.png

在流程图中,找出该自然数的所有因数属于子过程,前面已经给出了该子过程的流程图。

在流程图中,使用了while循环,让程序一直处于运行状态,等待学生的输入。当学生输入quit时,调用break语句退出while循环,程序结束。

循环体内首先提示学生输入一个自然数,输入quit可退出程序。学生输入自然数后,程序需要验证学生输入的是否是自然数,若是自然数,调用factor函数找出该自然数的所有因数,并输出这些因数到Shell窗口。若不是自然数,程序需要再判断学生输入的是否是quit,若是quit就调用break语句退出循环,否则输出错误提示信息。

阿萌找出了程序的输入与输出。

程序的输入是自然数n,可以使用input函数获取学生的输入,学生在输入的过程中,可能输入的不是自然数,因此程序需要有验证输入的机制,防止程序出现错误。

程序的输出是自然数n的所有因数,自然数n的因数存储到一个列表中,使用print函数可以直接输出列表的元素。

08.png

通过表格方式列出程序的输入和输出,是一种很好的程序设计方式。从表格中可以清晰看出程序需要哪些输入和哪些输出,以及输入输出的类型和方式。

阿萌编写的程序代码。


'''
程序文件:case01.py
功能描述:找出自然数n所有的因数
代码编写时间:2020/04/09
作者:编程训练营
'''
# 定义函数factor
def factor(n):
    # 创建一个空的list
    num_list = []
    for i in range(1,n+1):
        # 若n被i整除,i是n的因数
        if n % i == 0:
            # i添加到list
            num_list.append(i)
    return num_list
 
# 程序入口
if __name__ == '__main__':
 
    while(True):
        # 输入提示信息
        num = input("请输入一个自然数,输入quit可退出程序:")
        # 判断num是否全部是数字
        if num.isdigit():
            # 调用factor函数找出num的所有因数  
            print("%s的因数为:%s" % (num,factor(int(num))))
        # 判断num是否等于quit,如果是quit跳出循环
        elif num == "quit":
            break;
        # 输出错误信息提示
        else:
            print("输入错误,请输入一个自然数或者输入quit退出程序")

代码解读

使用while循环,并且设置循环条件为True,目的是让程序一直处于运行状态,随时等待学生的输入。

在这种情况下,程序需要提供一种程序退出机制,让学生来退出程序。这种退出机制就是学生可以输入quit字符串来退出程序。退出机制的实现就是在循环体内部判断学生输入的内容,如果输入的内容是quit,就调用break语句跳出while循环,程序的执行自然就结束了。

在while循环体内部,首先会提示学生输入一个自然数,或输入quit来退出程序,学生输入的内容被赋值给num变量。然后程序会判断num的内容是否是自然数,若是自然数就调用factor函数找出该自然数的所有因数,并输出这些因数。若不是自然数,再判断是否是quit,若是quit就调用break语句跳出循环,否则输出错误提示信息。

09.png

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论