【本文结构】题目信息:来源、地址、序号、描述
题目答案:简要分析,程序代码(测试运行通过,含注释),运行结果
霍霍磨刀:解答这道题目之前应掌握的知识基础
解析过程:题目类型,分析以及实践过程
斩获成果:通过解答这道题目之后的知识提升
下一题预告:来源、地址、序号、描述
【题目信息】
来源:菜鸟教程
序号:14
描述:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
【题目答案】
程序分析:
对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
程序代码:
def reduceNum(n): # 定义一个自定义函数
print('{} = '.format(n),end="") # 输出n值
if not isinstance(n, int) or n <= 0 : # 判断n的类型是否为int类型,也就是是否是整型,或者是不是小于0
print('请输入一个正确的数字 !') # 输出提示
exit(0) # 退出程序
elif n in [1] : # 或者判断是否是为1
print('{}'.format(n),end="") # 如果为1,那么1=1
while n not in [1] : # 循环判断不为1
for index in range(2, n + 1) : # 循环比它小的数
if n % index == 0: # 先找到一个最小的质数
n //= index # n 等于 n/index
if n == 1: # 如果n等于1
print(index) # 输出index
else : # 否则
print('{} * '.format(index),end="") # 输出等式右边的值
break # 跳出循环
reduceNum(90) # 函数调用,输入参数90
reduceNum(100) # 函数调用,输入参数100
运行结果:
90 = 2 * 3 * 3 * 5
100 = 2 * 2 * 5 * 5
【霍霍磨刀】
在解答这道题目之前,你首先应具备以下知识基础:了解什么是质因数
掌握基本的for循环,while循环,以及if判断
【解析过程】
题型:{语法实践题}
第一步:什么是质因数?并举例说明
每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 .
举例:
1没有质因子。
5只有1个质因子,5本身。(5是质数。)
6的质因子是2和3。(6 = 2 × 3)
2、4、8、16等只有1个质因子:2(2是质数,4 =2²,8 = 2³,如此类推。)
10有2个质因子:2和5。(10 = 2 × 5)
第二步:用程序来举例说明
因为1没有质因数,所以输入的数必然是2以上,以90为判断,依次除以1,2,3,4,5,6,7,…
90除以2=45,所以2是90的质因数,商为45
45除以2,余数不为0,45除以3,余数为0,因此3是90的质因数,商为15
15除以2,余数不为0,15除以3,余数为0,因此3是90的质因数,商为5
5除以2,3,4,余数均不为0 ,除以5,余数为0,因此5是90的质因数,商为1
因此90的质因数为2,3,3,5
用程序来演示:
n=int(input("请输入一个正整数:")) # 提示输入信息
k=1 # 定义变量k,用来逐步输出每个质因数的序号
while n>1: # 当n值大于1的时候运行下去
for i in range(2,n+1): # 循环2到n之间的值
if n % i==0: # 如果取余为0
print("第{}个质因数:{}".format(k,i)) # 则输出
k=k+1 # k自增1
n=n//i # 同时把n整除i的结果赋值给n
print("剩余的数:", n) # 输出整除之后的n
break # 跳出for循环
else: # 否则
print(n) # 输出n
运行结果:
请输入一个正整数:90
第1个质因数:2
剩余的数: 45
第2个质因数:3
剩余的数: 15
第3个质因数:3
剩余的数: 5
第4个质因数:5
剩余的数: 1
第三步:给出我的答案
根据上面的分析,整理代码,给出我的答案:
n = int(input("请输入一个正整数:")) # 提示输入信息
print("{}=".format(n),end="") # 输出n值
nlist=[] # 定义一个列表
while n > 1: # 当n值大于1的时候运行下去
for i in range(2, n + 1): # 循环2到n之间的值
if n % i == 0: # 如果取余为0
nlist.append(i) # 将质因数保存到列表中
n = n // i # 同时把n整除i的结果赋值给n
break # 跳出for循环
# join() 方法用于将序列中的元素(必须是str)以指定的字符 连接生成一个新的字符串
print(" * ".join(str(i) for i in nlist)) # 输出结果
运行结果:
请输入一个正整数:90
90=2 * 3 * 3 * 5
第四步:解释网站答案每段代码
为什么网站给得答案比我给的答案行数多,是因为它是自定义函数,考虑到了程序的健壮性,也就是我们不能相信用户输入的任何字符,要对字符进行验证检查
在网站给出的自定义函数中
首先是对输入的值进行了是否是整数,是否小于0的验证
其次是对输入的值进行了是否等于1的验证
最后才是对输入的值进行了求质因数的操作
【斩获成果】
通过本题的解答,我们学习了如何判断一个数是否为整型,且是否大于0,进而判断是否为正整数的方法
而且通过分析,了解了如何用程序来求正整数的质因数,并实现了相关代码,以及逐段逐行分析了网站给出的程序代码。
举一反三,抛出问题:
1.输入一个正整数,求最大公倍数
2.输入一个正整数,求最小公约数
3. 输入一个正整数,先计算出它下面的质数,再循环质数去判断,是否也是一种解答的可能性
【下一题预告】
来源:菜鸟教程
序号:15
描述:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示