[Tutor] OverflowError in lucky numbers script, was Re: Tutor Digest, Vol 95, Issue 55
Peter Otten
__peter__ at web.de
Sun Jan 22 09:25:13 CET 2012
Shreesh bhat wrote:
> *Lucky Numbers*
> A number is called lucky if the sum of its digits, as well as the sum of
> the squares of its digits is a prime number. How many numbers between A
> and B are lucky?
> Input:
> The first line contains the number of test cases T. Each of the next T
> lines contains two integers, A and B.
> Output:
> Output T lines, one for each case containing the required answer for the
> corresponding case.
>
> Constraints:
> 1 <= T <= 10000
> 1 <= A <= B <= 10^18
> Sample Input:
> 2
> 1 20
> 120 130
> Sample Output:
> 4
> 1
> Explanation:
> For the first case, the lucky numbers are 11, 12, 14, 16.
> For the second case, the only lucky number is 120.
>
>
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> My solution:
>
> def isprime(n):
> n=abs(int(n))
> if n<2:
> return False
> if n==2:
> return True
> if not n & 1:
> return False
> for x in range(3,int(n**0.5)+1,2):
> if n % x == 0:
> return False
> return True
>
> def islucky(n):
> sum1=0
> sum2=0
> while n!=0:
> r=n%10
> sum1+=r
> sum2+=r*r
> n=n/10
> if isprime(sum1) & isprime(sum2):
> return True
> return False
Don't use '&' here, you're not bit-twiddling and the idiomatic code is
return isprime(sum1) and isprime(sum2)
which also has the advantage that it "short-ciruit"s, i. e. isprime(sum2) is
only evaluated if isprime(sum1) is true.
> number=raw_input()
>
>
> for i in range(int(number)):
> inp=raw_input()
> a=inp.split()
> startnum=int(a[0])
> endnum=int(a[1])
> li=map(islucky,xrange(startnum, endnum))
> count=0
> for j in li:
> if j:
> count+=1
> print count
>
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Traceback (most recent call last): File
> "/run-1327085301-1965755690/solution.py",
> line 35, in li=map(islucky,xrange(startnum, endnum))
> OverflowError: Python int too large to convert to C long
>
>
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> It shows this error for very large numbers or slows down with large
> numbers. I m using Ubuntu 32-bit.
The arguments of xrange() are limited to C integers, they cannot be larger
than sys.maxint (2**31-1 on a 32-bit system or 2**63-1 on a 64-bit system).
range() can handle larger numbers, but you'll always see a slowdown --
larger numbers have more digits and (on average) larger sums, and thus take
longer to test.
More information about the Tutor
mailing list