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')