我正在取一个数字的平方根,我想找出它是不合理的还是复杂的,并返回真或假
测试用例,其中,对于无理/复数,取数字的平方根为True
;如果平方根为False
或float
,则为int
。 / p>
[IN 1] 20
[OUT 1] True
[IN 2] 25
[OUT 2] False
[IN 3] -1
[OUT 3] True
[IN 4] -20
[OUT 4] True
[IN 5] 6.25
[OUT 5] False
如何制作实现此功能的功能?
答案 0 :(得分:1)
很容易检查一个数字是否有复杂的平方根,如果你有一个负数就是这种情况:
def has_complex_sqrt(num):
return num < 0
然而,要找出一个数字是否具有不合理的平方根,则更难。如果您的号码是字符串,那么的工作方式,因为fractions.Fraction
可以计算此数字的确切代表。
然后,如果表示数字的分数的分子和分母的每个素数因子具有偶数指数,则使用数字的平方根只能是有理数的事实。 (网上有很多资源支持这个)
所以解决这个问题的步骤是:
在代码中实现:
from fractions import Fraction
def get_fraction_from_string(num):
return Fraction(num)
def get_prime_factors(n):
# Taken from http://stackoverflow.com/a/22808285/5393381
# you might implement another algorithm here!
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
from collections import Counter
def has_even_exponents(primefactorized):
return all(num % 2 == 0 for num in Counter(primefactorized).values())
最后把这一切都放到一个&#34;超级功能&#34;:
def has_irrational_sqrt(astring):
fract = get_fraction_from_string(astring)
primefactors_numerator = get_prime_factors(fract.numerator)
if not has_even_exponents(primefactors_numerator):
return True
primefactors_denominator = get_prime_factors(fract.denominator)
if not has_even_exponents(primefactors_denominator):
return True
return False
为方便起见,检查两者中是否有任何一项的另一个函数是True
:
def has_irrational_or_complex_sqrt(num):
return has_complex_sqrt(float(num)) or has_irrational_sqrt(num)
现在进行互动测试:
>>> has_irrational_or_complex_sqrt('20')
True
>>> has_irrational_or_complex_sqrt('25')
False
>>> has_irrational_or_complex_sqrt('-1')
True
>>> has_irrational_or_complex_sqrt('-20')
True
>>> has_irrational_or_complex_sqrt('6.25')
False
产生预期值。乌拉!
如果您的输入已经是float
,则可能 无法正常工作!
>>> has_irrational_or_complex_sqrt('0.01')
False
>>> has_irrational_or_complex_sqrt(0.01) # Oups!
True
但是在你的例子中它起作用是因为6.25
可以完全表示为float:
>>> has_irrational_or_complex_sqrt(6.25)
False
答案 1 :(得分:-1)
基于@MSeifert的答案,但写得更简单:
import collections, fractions
def get_prime_factors(n):
#http://stackoverflow.com/a/22808285/5393381
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
def has_irrational_square_root(num):
#http://stackoverflow.com/questions/42302488/identify-a-irrational-or-complex-number
frac = fractions.Fraction(str(num))
top_primes = get_prime_factors(frac.numerator)
bottom_primes = get_prime_factors(frac.denominator)
all_even_top = all(num % 2 == 0 for num in collections.Counter(top_primes).values())
all_even_bottom = all(num % 2 == 0 for num in collections.Counter(bottom_primes).values())
if all_even_top and all_even_bottom:
return False
return True