我的程序here出现了溢出错误!我意识到该程序的错误。当涉及到很长的整数时,我不能使用范围或xrange。我尝试在Python 3中运行该程序,它的工作原理。我的代码可以工作但几次后响应。因此,为了优化我的代码,我开始考虑优化代码的策略。
我的问题陈述是一个数字,如果它的数字之和,以及其数字的平方和是素数,则称为幸运数字。 A和B之间有多少数字是幸运的?。
我从这开始:
squarelist=[0,1,4,9,16,25,36,49,64,81]
def isEven(self, n):
return
def isPrime(n):
return
def main():
t=long(raw_input().rstrip())
count = []
for i in xrange(t):
counts = 0
a,b = raw_input().rstrip().split()
if a=='1':
a='2'
tempa, tempb= map(int, a), map(int,b)
for i in range(len(b),a,-1):
tempsum[i]+=squarelist[tempb[i]]
我想要实现的是因为我知道系列是有序的,只有最后一个数字会改变。我可以保存列表中较早数字的平方和,并不断更改最后一个数字。这不会每次计算总和并检查平方和是否为素数。我无法将金额固定为某个值,然后不断更改最后一个数字。如何从这里继续前进?
我的样本输入如下。
87517 52088
72232 13553
19219 17901
39863 30628
94978 75750
79208 13282
77561 61794
答案 0 :(得分:1)
我根本没有得到你想要的代码。根据我的理解,这是我对问题的解决方案:对于 X 范围内的所有自然数 n ,以便 a< X< b 表示某些自然数字 a , b a< b ,有多少个数字 n 具有这样的属性,即其数字的总和以及十进制书写中数字的平方和是否都是素数?
def sum_digits(n):
s = 0
while n:
s += n % 10
n /= 10
return s
def sum_digits_squared(n):
s = 0
while n:
s += (n % 10) ** 2
n /= 10
return s
def is_prime(n):
return all(n % i for i in xrange(2, n))
def is_lucky(n):
return is_prime(sum_digits(n)) and is_prime(sum_digits_squared(n))
def all_lucky_numbers(a, b):
return [n for n in xrange(a, b) if is_lucky(n)]
if __name__ == "__main__":
sample_inputs = ((87517, 52088),
(72232, 13553),
(19219, 17901),
(39863, 30628),
(94978, 75750),
(79208, 13282),
(77561, 61794))
for b, a in sample_inputs:
lucky_number_count = len(all_lucky_numbers(a, b))
print("There are {} lucky numbers between {} and {}").format(lucky_number_count, a, b)
一些注意事项:
is_prime
是最可能实现的。对于样本输入来说,它仍然足够快。有许多更好的实现可能(只有一个google)。最明显的改进是跳过除了2之外的每个偶数。仅此一项就可以将计算时间缩短一半。//=
强制除法的结果为整数,并使用range
而不是xrange
。此外,加速is_prime
的一种简单方法是Python 3的@functools.lru_cache。如果您想保存一些行,请将这些数字的总和计算为str
,然后再将其转换为int
:
def sum_digits(n):
return sum(int(d) for d in str(a))
但它不是 mathy 。