num = input ()
fact = 0
while fact != num:
fact = fact + 1
rem = num % fact
if rem == 0:
print fact
答案 0 :(得分:3)
您只需要转到输入数字的平方根来获取所有因子(不是其他地方建议的数字的一半)。例如,24具有因子1,2,3,4,6,8,12,24。sqrt(24)约为4.9。检查1并且也得到24,检查2并且也得到12,检查3并且也得到8,检查4并且也得到6.因为5> 4.9,无需检查。 (是的,我知道24不是最好的例子,因为小于sqrt(24)的所有整数都是24的因子。)
factors = set()
for i in xrange(math.floor(math.sqrt(x))+1):
if x % i == 0:
factors.add(i)
factors.add(x/i)
print factors
对于大数字,有一些非常复杂的方法可以做得更好,但这应该可以让你获得不错的运行时改进。根据您的应用程序,缓存还可以为您节省大量时间。
答案 1 :(得分:2)
对于初学者使用for
循环。然后,让Python为你增量,并摆脱不必要的rem
变量。除了以“Pythonic”方式之外,此代码与您的代码完全相同。
num = input()
for x in xrange(1, num):
if (num % x) == 0:
print fact
xrange(x, y)
返回x的所有整数的生成器,但不包括y。
答案 2 :(得分:2)
那么打印出一个数字的所有因素?第一个明显的优化是当事实* 2大于num时你可以退出。任何大于num的一半都不是一个因素。这是一半的工作立即被抛弃。
第二个是你更好地寻找素因子化并从中得出所有可能的因素。对于那种事情,有一堆really smart algorithms。
答案 3 :(得分:2)
一旦你到达那里(一旦事实> num / 2),你就不会发现任何新的数字,因为通过计算每个数字的num / fact可以发现数字/数字以上(这也可以用于轻松打印每对数字。)
以下代码应该在每次计算时将时间缩短几秒钟,并将num切成两半,其中num为奇数。希望你能跟着它,如果没有,请问。 如果我以后想到的话,我会添加更多。
def even(num):
'''Even numbers can be divided by odd numbers, so test them all'''
fact=0
while fact<num/2:
fact+=1
rem=num % fact
if rem == 0:
print '%s and %s'%(fact,num/fact)
def odd(num):
'''Odd numbers can't be divided by even numbers, so why try?'''
fact=-1
while fact<num/2:
fact+=2
rem=num % fact
if rem == 0:
print '%s and %s'%(fact,num/fact)
while True:
num=input(':')
if str(num)[-1] in '13579':
odd(num)
else:
even(num)
答案 4 :(得分:1)
答案 5 :(得分:1)
是。使用quantum computer
Shor的算法,以数学家Peter Shor命名,是一个量子 用于整数的算法(在量子计算机上运行的算法) 因子化于1994年制定。非正式地解决了以下问题 问题:给定整数N,找到其主要因子。
在量子计算机上,要求整数N,Shor的算法运行 在多项式时间内(所用的时间是log N中的多项式,即 输入的大小)。具体来说,需要时间O((log N)3), 证明整数分解问题可以 在量子计算机上有效地解决,因此具有复杂性 BQP班。这比已知的最有效指数快得多 经典因子算法,一般数字域筛,其中 在亚指数时间内工作 - 约为O(e1.9(log N)1/3(log log N)2/3)。 Shor算法的效率是由效率决定的 量子傅里叶变换和模幂运算 squarings。
答案 6 :(得分:1)
不幸的是,在Python中,divmod操作是作为内置函数实现的。尽管硬件整数除法经常同时产生商和余数,但我所知道的非汇编语言没有实现/%
或//%
基本运算符。
所以:如果计算机器操作,以下是一个更好的强力算法。它得到O(sqrt(N))时间内的所有因子,而不必计算sqrt(N) - 看,妈妈,没有浮点!
# even number
fact = 0
while 1:
fact += 1
fact2, rem = divmod(num, fact)
if not rem:
yield fact
yield fact2
if fact >= fact2 - 1:
# fact >= math.sqrt(num)
break