Python Exercise 4
1. In the nine-digit Social Insurance Number (SIN) given to each person having a job or
filing an income tax return in Canada, the ninth digit is a checked digit that is used to test
the validity of the other digits in the SIN. The ninth digit is determined by the following
procedure.
a. Double the 2 nd , 4 th , 6 th , and 8 th digits, if it will become a 2 digit number, add all the
digits to make it a single digit. For example, 6x2 =12, then 1+2=3
b. Add the digits of the number found in step (a)
c. Add the 1 st , 3 rd , 5 th , and 7 th digits.
d. Add the number found in steps (b) and (c)
e. Subtract the units digit of the result of step (d) from 10 and note the units digit of the
result. For the SIN to be valid, its ninth digit must have this value.
Write a program that repeatedly reads nine-digit numbers and determines whether or not
each number is a valid SIN> The program should stop when it reads the value
999999999.

Respuesta :

tonb

Answer:

# stack counter

def sc(n):

   sum = 0

   for d in str(n):

       sum += int(d)

   if sum>9:

       return sc(sum)

   return sum

# double stack count

def dsc(n):

   return sc(2*n)

def isValidSIN(s):

   if len(s) != 9:

       return False

   sum = dsc(s[1]) + dsc(s[3]) + dsc(s[5]) + dsc(s[7])

   sum += int(s[0]) + int(s[2]) + int(s[4]) + int(s[6])

   checkDigit = (10 - (sum % 10))%10

   return int(s[-1]) == checkDigit

   

SINS = [

'518759097',

'066600271',

'666062989',

'299675595',

'022147292',

'321122210',

'553277039',

'398148031',

'392430286',

'548504232',

'463665182',

'217427954',

'204305551',

'000071647']

for sin in SINS:

   if isValidSIN(sin): print(sin + " is valid")

   else: print(sin + " is INVALID")

Explanation:

I do believe there is a mistake in step e. If the sum has a units digit of 0, the subtraction would give you 10 for the check digit and that will fail. Therefore I added another modulo 10.