Check out the wikipedia article on square numbers (the numbers article, not the algebra one).

A couple few interesting properties emerge that can be exploited.

http://en.wikipedia.org/wiki/Square_number

1) A square number can end only with digits 00,1,4,6,9, or 25 in base 10; So that eliminates 2 digits, we now end with a 9.

2) Squares of odd numbers are odd.

3) If the last digit of a number is 3 or 7, its square ends in 9.

and if, and if, and if … you get the idea.

PS. I could have used the divisible by 4 rule also here, but I didn’t need to. This routine still runs in under a minute without importing psyco.

```
```class Problem:
def test (self, n):
N = str(n*n)
if N[0] == '1':
if N[2] == '2':
if N[4] == '3':
if N[6] == '4':
if N[8] == '5':
if N[10] == '6':
if N[12] == '7':
if N[14] == '8':
if N[16] == '9':
return True
return False
def Solution(self):
number = 0
start = int(math.floor(math.sqrt(10203040506070809)))
end = int(math.floor(math.sqrt(19293949596979899)))
for i in range (start,end):
if i % 2 != 0:
if int(str(i)[-1]) == 3 or int(str(i)[-1]) == 7:
if self.test(i) == True:
number = int(math.sqrt(int(str(i*i)+"00")))
break
print "Answer =", number
if __name__ == '__main__':
P = Problem()
P.Solution()