超级素数幂 Python 版

题目
如果一个数字能表示成 p^q,且p是一个素数,q为大于1的正整数,则此数字就是超级素数幂。
param number: 测试该数字是否是超级素数幂
return: 如果不是就返回 False,如果是就返回 p 和 q 值
例如,输入125,返回(5,3)

代码

import math


def get_prime(number):
    '''
    寻找小于number的所有的质数,时间复杂度o(n^2)
    '''
    if number <= 1:
        print 'Wrong given number.'
        return
    prime = []
    for i in xrange(2, number+1):
        j = 2
        while j < i:
            if i % j == 0:
                break
            j += 1
        if j == i:
            prime.append(i)
    return prime

def super_prime_power(number):
    scope = int(math.ceil(math.sqrt(number)))  # 开根号除掉一部分不需要的数
    prime_number = get_prime(scope)
    be_tested = []
    for i in prime_number:  # 先将无法被整数的排除掉
        if number % i == 0:
            be_tested.append(i)
    for p in be_tested:
        q = 2
        while p ** q <= number:
            if p ** q == number:
                return (p, q)
            q += 1
    return False

print super_prime_power(999)

分析
总的时间复杂度为o(sqrt(n)log n),再加上寻找质数花费的时间,总的时间复杂度为o(n^2 sqrt(n)log n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值