备战蓝桥python——完全平方数

完全平方数

链接: 完全平方数
备战蓝桥python——完全平方数_第1张图片

暴力解法:

n = int(input())
for i in range(1, n+1):
    if(((i*n)**0.5)%1==0.0):
        print(i)
        break

运用数论相关知识求解

任意一个正整数都可以被分解成若干个质数乘积的形式,例如 : 20 =   2 2 ∗ 5 1   20 = \ 2^{2}*5^{1}\, 20= 2251

由此,我们不难分析出,只要分解出的质因数的幂次项均为偶数,这个数就是完全平方数了

100 =   2 2 ∗ 5 2   100 = \ 2^{2}*5^{2}\, 100= 2252
这就是我们寻找x的方法

搜索范围的问题

我们确定搜索范围为[1, int(n**0.5)]
我们是如何推导出来的呢?

1)如果这个数本身就是完全平方数,也就是:
100 =   2 2 ∗ 5 2   100 = \ 2^{2}*5^{2}\, 100= 2252
对100开根号结果为10,包含了两个质因数,那么我们肯定可以搜索到它的质因数

2)如果这个数本身不是完全平方数,也就是:
20 =   2 2 ∗ 5 1   20 = \ 2^{2}*5^{1}\, 20= 2251
对20开根号,取整得到4,在二者中间,并且后者幂次项为奇数,最后直接乘上就好了

完整代码

def zhi(x):
    for i in range(2, int(x**0.5)+1):
        if(x%i==0):
            return False

    return True

n = int(input())
ans=1
for i in range(2, int(n**0.5)+1):
    if(n%i==0 and zhi(i)):
        k=0
        while n%i==0:
            n/=i
            k+=1
        if(k&1):
            ans*=i
if(n>1):
    ans*=n
print(int(ans))

你可能感兴趣的:(蓝桥杯冲刺,python,算法,蓝桥杯)