运维小书童 发表于 2017-8-4 12:09:57

欧拉计划-合数的最大质因子-求解惑

我的方案是
#计算一个合数的最大质因子
import time

number = int(input('请输入要求最大质因子的数字:'))
start = time.clock()

def prime(param):
    '判断是否是质数'
    if param < 3:
      return 1
    for i in range(3,param-1):
      if param%i == 0:
            return 0
    return 1

'''质因子从该数字number的中间处开始判断
    -只判断奇数数字 每次递减2
    -先判断是因子、再判断是质数
    -满足条件即是所需的最大质因子
'''
factor = number // 2
if factor%2 ==0:
    factor = factor + 1
while 1:
    if number%factor ==0:
      if prime(factor):
            print('%d的最大质因子是%d'%(number, factor))
            break
    factor -= 2


end = time.clock()
print('耗时:%f'%(end - start))

--计算9位数耗时就有3s
--看了其他鱼友的代码发现他们先对合数进行开方,在平方根的范围内判断
求解为什么要先开方。。。。。。。。。

ba21 发表于 2017-8-4 15:33:44

本帖最后由 ba21 于 2017-8-4 17:29 编辑

假设:

请输入要求最大质因子的数字:99
99的最大质因子是11
---------------------------------------------
11 * 11 =121要比99大了。先开方就能最快的判断出最大质因子数。 得到的是一个小于或等于它的平方根的数 然后根据这个计算出最大质因子
====================================================
请输入要求最大质因子的数字:98
98的最大质因子是7(2*7*7 = 98)
-----------------------------------------------------
98开方后约为10, 10*10=100 比98大了。 得到的是一个小于或等于它的平方根的数 然后根据这个计算出最大质因子

运维小书童 发表于 2017-8-4 16:39:10

ba21 发表于 2017-8-4 15:33
假设:

请输入要求最大质因子的数字:99


感谢版主的回答!
那如果要判断的数字是:95
95的最大质因子是 :19
19就要比95的平方根大了 这种情况就出错了。
还是判断的数字有什么特殊情况需要考虑吗?

冬雪雪冬 发表于 2017-8-4 16:58:13

运维小书童 发表于 2017-8-4 16:39
感谢版主的回答!
那如果要判断的数字是:95
95的最大质因子是 :19


应该这样理解,如果没有平方根之内的因子,就不可以有更大的因子。以95为例,如果没有10以内的因子5,就不可能有19.所以判断到平方根就可以了。

ba21 发表于 2017-8-4 17:22:37

本帖最后由 ba21 于 2017-8-4 17:28 编辑

运维小书童 发表于 2017-8-4 16:39
感谢版主的回答!
那如果要判断的数字是:95
95的最大质因子是 :19


查了下资料:
因为如果一个数不是素数是合数,
那么一定可以由两个自然数相乘得到,
其中一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现。

所以 开出来的根 得到的是一个小于或等于它的平方根的数 然后根据这个计算出最大质因子
页: [1]
查看完整版本: 欧拉计划-合数的最大质因子-求解惑