用人止太太的Griffindor镇贴!今天刚收到的,什么神仙画画[cry][cry]
分解质因数的方法1:
Drifter_y 提供的方法如下:
def fun():
num=int(input("please input a number:"))
if not isinstance(num,int) or num <0:
print("it is not a correct number")
elif num==1:
print("%d=%d" %(num,num))
else:
while True: #必须要while循环,质数可能有重复的. 这个条件是有问题的,跳不出去,应该改成while num!=1
for i in range (2,num+1): #保证i能取到num
if num%i==0:
num=int(num/i)
if num==1: #除到最后的一个质数,num就为1了 这样的条件语句很巧妙地处理了最后一个打出*的问题
print("%d" %i,end='')
else:
print("%d*" %i,end='')
break
一开始看到这个代码,觉得它没有出口,冷静下来一看,它的出口就是i 的for循环到顶。
num在执行过程中会改变,range的范围也会改变,但不影响找质因数。
该执行的本质就是:任何数都可以分解成质因数,一个break相当于抽走了所有2,3,5...的倍数。当执行到底,就跳出while True循环了。
这样一想,我也知道我的代码错误在哪里了。以下是我的代码:
from math import *
num = eval(input('please enter a number:'))
list = []
for i in range(2,num):
k = 1
for j in range(2,i):
if i % j == 0:
k = 0
break
if k ==1:
list.append(i)
#print(list)
while True:
for i in list:
if num % i == 0:
num = num % i
if num == 1:
print('%d'%i,end = '')
else:
print('%d*'%i,end = '')
break
由于我break了,所以for循环永远落到第一个,也就是2....很尴尬了,没有必要把质因数找出来,因为可以重复同一个质因数呀(我今天上午脑子一定是乱码了)。
***比较重要的一点事,range里面的数据类型一定要是int,而不是float
分解质因数的方法2:
我修改之后(结合daxia5398的想法),改为了正确的代码
def fun(num,list = None):
if list is None:
list = []
for i in range(2,num):
while num % i == 0:
list.append(i)
num = int(num / i)
if num > 1:
fun(num)
return list