大致思路
首先定义一个函数用于判断某数是否为质数,判断思路是从2开始,到该数的平方根为止,遍历判断该数是否能被这些数整除,若能则不为质数,若都不能则为质数。
import math
def isPrime(n):
sqr = int(math.sqrt(n)) #求该数的平方根
if(n==1):return False #若该数为1,则不是质数
for i in range(2,sqr + 1):
if(n % i ==0):return False #若能被某一数整除,则不是质数
return True #该数为质数
然后利用递归调用的方法找出该数所有的质因数,代码如下:
def findPrimeFactors(n,dict_PrimeFactors): #质因数分解,质因数与质因数的个数存储以键值对的形式存储在字典中
sqr = int(math.sqrt(n))
if (isPrime(n)): #若该数为质数,则其下一步质因数分解为其本身
if str(n) in dict_PrimeFactors.keys():
dict_PrimeFactors[str(n)] += 1
else:
dict_PrimeFactors[str(n)] = 1
else: #若该数不是质数,则进行质因数分解
for i in range(1,sqr + 1):
if(isPrime(i)):
if(n%i == 0):
if str(i) in dict_PrimeFactors.keys():
dict_PrimeFactors[str(i)] += 1
else:
dict_PrimeFactors[str(i)] = 1
new_n = int(n/i)
findPrimeFactors(new_n,dict_PrimeFactors)
return dict_PrimeFactors
def prime_factors(n): #将质因数字典中的信息转换为题目所要求的字符串
d_PrimeFactors = {}
findPrimeFactors(n,d_PrimeFactors)
prime_factors_str = ''
for i in d_PrimeFactors.keys():
if(d_PrimeFactors[i] > 1):
temp_str = '(' + i + '**' + str(d_PrimeFactors[i]) + ')'
prime_factors_str += temp_str
else:
prime_factors_str += '(' + i + ')'
print(prime_factors_str)
以下是整体代码
# -*- coding: utf-8 -*-
"""
codewars Kata: Primes in numbers
Created on Sun Jan 3 10:43:28 2021
@author: Pray
"""
import math
def isPrime(n):
sqr = int(math.sqrt(n)) #求该数的平方根
if(n==1):return False #若该数为1,则不是质数
for i in range(2,sqr + 1):
if(n % i ==0):return False #若能被某一数整除,则不是质数
return True #该数为质数
def findPrimeFactors(n,dict_PrimeFactors): #质因数分解,质因数与质因数的个数存储以键值对的形式存储在字典中
sqr = int(math.sqrt(n))
if (isPrime(n)): #若该数为质数,则其下一步质因数分解为其本身
if str(n) in dict_PrimeFactors.keys():
dict_PrimeFactors[str(n)] += 1
else:
dict_PrimeFactors[str(n)] = 1
else: #若该数不是质数,则进行质因数分解
for i in range(1,sqr + 1):
if(isPrime(i)):
if(n%i == 0):
if str(i) in dict_PrimeFactors.keys():
dict_PrimeFactors[str(i)] += 1
else:
dict_PrimeFactors[str(i)] = 1
new_n = int(n/i)
findPrimeFactors(new_n,dict_PrimeFactors)
return dict_PrimeFactors
def prime_factors(n): #将质因数字典中的信息转换为题目所要求的字符串
d_PrimeFactors = {}
findPrimeFactors(n,d_PrimeFactors)
prime_factors_str = ''
for i in d_PrimeFactors.keys():
if(d_PrimeFactors[i] > 1):
temp_str = '(' + i + '**' + str(d_PrimeFactors[i]) + ')'
prime_factors_str += temp_str
else:
prime_factors_str += '(' + i + ')'
return prime_factors_str
网上大神的代码
看完大神的代码,又一次深感我在CSDN凑数的日子……
def primeFactors(n):
ret = ''
for i in range(2, n + 1):
num = 0
while(n % i == 0):
num += 1
n /= i
if num > 0:
ret += '({}{})'.format(i, '**%d' % num if num > 1 else '')
if n == 1:
return ret