质因数分解,输一个数x,求它的质因数。如输入60,则得到60=223*5
我认为的解题思路是——
先找出小于整数x的质数(素数)集合,从小到大遍历素数集合,如果能整除,收集该素数并让x /= i ,继续除;不能循环,继续循环。输出收集到的素数集合即是x的质因式集合。
代码运行效果截屏图片
Python 代码
#!sur/bin/nve python
# coding: utf-8
'''
分解质因数
'''
def isprime(n) -> list:
''' 素数确认 '''
if n < 2:
return # 小于2的不是素数。
for i in range(2, n):
if not n%i:
return # 能被 1 < i < n 整除,就不是质数。
return n # 返回质数。
def factors(n) -> list:
''' 分解质因数 '''
primes = [i for i in range(n+1) if isprime(i)] # 解析不大于整数的素数集合。
factors = [] # 质因式集合初值。
for i in primes:
while True:
if not n%i:
n /= i
factors.append(i) # 收集质因数。
else:
break
return ' × '.join(map(str, factors)) # 格式化质因数集合为字符串。
if __name__ == '__main__':
n = int(input(f"\n{' 分解质因数 ':~^45}\n\n{'输入一个整数:':>11}"))
factor = f"{n} = {factors(n)}"
print(f"\n\n{factor:^50}\n{'':~^50}\n")
更多详情请翻阅我的学习笔记——
但如果是其余尺寸呢?我们不妨设新的图像尺寸为x,即w,h均为x。(步长为1,不填充)
第一种卷积核(5*5),其参数量为5*5=25个,卷积次数为(x-4)^2次。(减4是因为卷积的操作,在不填充零的情况下会损失左、右边各两个元素)
故计算量为25*(x-4)2=25x2-200x+400次。
第二种卷积核(3*3)*2,其参数量为3*3+3*3=18个,卷积次数为(x-2)2+(x-2-2)2次。(减2是因为卷积的操作,在不填充零的情况下会损失左右边各1个元素.第二部分减2再减2是因为进行了第二次卷积,输出的特征图更小了。)
故计算量为18*[(x-2)2+(x-2-2)2]=18x2-108x+180次。
接下来只需要比较下面两个式子的大小来就可以了,即:25x2-200x+400和18x2-108x+180
我可以使用试除法来实现对一个数字进行质因数分解。具体步骤如下:
factorize(num)
,参数为待分解的整数 num
。factors
,用于存储所有的质因数。num
的最小质因数 i
,并将其加入到 factors
列表中。如果 i
是 num
自身,则跳出循环。num
除以 i
的商作为新的 num
的值,重复步骤3直到 num
等于1。factors
列表作为结果,其中的元素就是 num
的质因数。下面是实现该算法的 Python 代码:
def factorize(num):
factors = []
i = 2
while i <= num:
if num % i == 0:
factors.append(i)
num //= i
else:
i += 1
return factors
例如,调用 factorize(60)
,将会返回 [2, 2, 3, 5]
,即数字60的质因数是2、2、3和5。