12. 将一个正整数分解质因数
方法1:有一点点麻烦,分为两部分:1.先筛选出小于这个正整数的所有质数;2.再从这些质数中提取因数。
# 将一个正整数分解质因数
from math import sqrt
n = eval(input("输入一个大于1的正整数:"))
def prime_num(n):
# 存储小于n的质数
leap = 1
nums = []
for m in range(2, n + 1):
k = int(sqrt(m + 1))
for i in range(2, k + 1):
if m % i == 0:
leap = 0
break
if leap == 1:
nums.append(m)
leap = 1
return nums
def factor_pn(n, nums):
i = 1
the_num = n
for j in nums:
while j <= the_num:
if the_num % j == 0:
factor = j # 质因数
if i == 1:
print(factor, end=' ')
else:
print('*', factor, end=' ')
the_num = int(the_num / j)
i += 1
else:
break
nums = prime_num(n)
print(n, '以内的质数:', nums)
print('分解质因数:')
factor_pn(n, nums)
函数prime_num(n)也可直接用来解决输出某个正整数以内的质数问题。
方法2:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
1.如果这个质数恰好等于n,则说明分解质因数的过程已经结束,打印出即可;
2.如果n>k,但能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,然后重复第一步;
3. 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
这个方法其实和方法1中的函数factor_pn(n, nums)是差不多的,也可以说方法1的第一步其实是多余的,因为每次都将the_num 除以 j的商赋值给the_num,也就不会有非质数的存在了。
from sys import stdout
n = int(input("输入一个大于1的正整数:"))
for i in range(2, n + 1):
while n != i:
if n % i == 0:
stdout.write(str(i))
stdout.write('*')
n = n / i
else:
break
print(int(n))
关于stdout.write(),其实当我们在 Python 中调用 print(obj) 的时候,事实上是调用了sys.stdout.write(obj '\n')
print 将obj打印到了控制台,然后又追加了一个换行符“\n”
print 其实可以看作是调用了 sys.stdout 的 write 方法。
看一个简单的例子会帮助理解:
import sys
sys.stdout.write('hello')
sys.stdout.write('world')
print('\n')
sys.stdout.write('hello\n')
sys.stdout.write('world\n')
print('\n')
print('hello')
print('world')