python如何判断数字超过 32 位有符号整数范围 python中判断数字_python 用if判断一个数是不是整数


申明:以下题目摘自Codewars

题目1:Given an integral number, determine if it's a square number。(7级)


def


程序思路:首先,平方数肯定是某个整数的平方,一定非负。其次,一个数是平方数,那么它的平方根也是整数,即存在一个整数,这个整数的平方等于需要判断的整数n。

for i in range(int(n**0.5)+1): 表示 i 从0到 int(n**0.5)+1迭代。而int(a)是将数a的小数部分直接丢掉取整。由于range(a,b)只会迭代到b-1,因此要+1。

更简单的写法如下:


from math import sqrt
def is_square(n):
    return n > 0 and sqrt(n).is_integer()


巧妙的运用了布尔运算以及is_integer()和sqrt()函数


题目2:ATM machines allow 4 or 6 digit PIN codes and PIN codes cannot contain anything but exactly 4 digits or exactly 6 digits.If the function is passed a valid PIN string, return true, else return false.传入一个字符串,如果是4为或者6为数字,则返回正确,否则返回错误。(7级)


def validate_pin(pin):
      return pin.isdigit() and (len(pin)==4 or len(pin)==6)


若将(len(pin)==4 or len(pin)==6)简化,可以写为:


def validate_pin(pin):
    return len(pin) in (4, 6) and pin.isdigit()


利用正则表达式的写法如下:


import re
def validate_pin(pin):
    return bool(re.match(r'^(d{4}|d{6})$',pin))


re.match()若没有匹配到,返回None,在bool()里解释为False。详见


ruinyou:Python小白的日常练习之Codewarszhuanlan.zhihu.com

python如何判断数字超过 32 位有符号整数范围 python中判断数字_Python_02



题目3:You have to write the function findMissing(list), list will always be at least 3 numbers. The missing term will never be the first or last one.给出一列有规律的数字,例如:[1, 3, 5, 9, 11],找到缺失的数字,即7。题目中的规律均是线性关系。(6级)


def find_missing(sequence):
    for i in range(len(sequence)):
        interval = (sequence[-1]-sequence[0])/len(sequence)
        a = sequence[i+1]-sequence[i]
        if (a!=interval):
            return int(sequence[i]+interval)


程序思路:首先 The missing term will never be the first or last one 根据计算出相邻数据的间隔,然后依次计算相邻数字之间的间隔,与计算出的间隔进行比较,最终找出缺失数字。

也可巧妙的采用等差数列求和公式找到缺失数字,如下:


def find_missing(sequence):
    t = sequence
    return (t[0] + t[-1]) * (len(t) + 1) / 2 - sum(t)



题目4:找到一组数据中的数字,这个数字左侧所有数字之和等于其右侧所有数字之和。例如:{1,2,3,4,3,2,1}这个数字是4,{1,100,50,-51,1,1}数字是100。若不存在这样的数字,则返回-1。(6级)


def find_even_index(arr):
    for i in range(len(arr)):
        left=sum(arr[:i]);right=sum(arr[i+1:])
        if(left == right):
            return i 
    return -1


程序思路:首先对列表进行切片,分别计算左右两边数字之和并比较,若相同则返回下标i。


题目5:Ore Numbers (also called Harmonic Divisor Numbers) are numbers for which the harmonic mean of all their divisors (including the number itself) equals an integer.判断一个数是否为谐波数,该数有这样的特性:其所有除数的个数(包括1和它本身)除以除数的倒数和为一个整数。例如:H(6) = 4 / (1/1 + 1/2 + 1/3 + 1/6) = 2。数字6就是一个谐波数。


def is_ore(n):###最好避免分数
    divisors = [a for a in range(1,n+1) if(n % a==0)]
    add = [b for b in divisors]
    return True if ((n*len(divisors))%sum(add)==0) else False


由于计算机在计算分数时会存在精度问题,除了像上述代码这样进行化简避免分数运算,还可以使用fractions库,如下:


from fractions import Fraction
def is_ore(n):
    divisors = set([1, n])
    for d in range(2, int(n**0.5)+1):
        if n % d == 0:
            divisors.update(set([d, n/d]))
    mean = Fraction(len(divisors), 1)/sum(Fraction(1, d) for d in divisors)
    return mean.denominator == 1


mean是一个Fraction对象,访问它的denominator属性,即访问它的分母。若是整数,分母为1。numerator为分子属性。