
Attempt 1
Following is my first submission, which did not pass.
T = int(input())
for t in range(T):
isPlus = 1
str_num = input()
i = 0
for i in range(len(str_num)):
if i == len(str_num) - 1:
if int(str_num[i]) % 2:
isPlus = -1
else:
isPlus = -2
break
curr_digit = int(str_num[i])
if curr_digit % 2:
next_digit = int(str_num[i + 1])
if next_digit < 5 or curr_digit == 9:
# minus
isPlus = 0
break
res = 0
digits_left = len(str_num) - i - 1
current = int(str_num[i:])
if isPlus == 1:
target = int(str(int(str_num[i]) + 1) + '0' * digits_left)
res = target - current
elif isPlus == 0: # minus
target = int(str(int(str_num[i]) - 1) + '8' * digits_left)
res = current - target
elif isPlus == -1: # even originally
res = 1
else:
res = 0
print('Case #{}: {}'.format(t + 1, res))
Attempt 2
I find the hint to be more complicated than mine, but it provides me a more systematic way to solve this problem.

I tried to stick with this hint and tested every special case. It turned out that there are 2 special cases for the upper function – When there is a carry generated and when there is a series of carries rippling forward. To solve that, I implemented the upper function in a recursive manner.
def upper(s):
res = -1
for i in range(len(s)):
if int(s[i]) % 2 == 1:
if i == 0 and s[i] == '9':
res = int('10' + s[1:])
break
res = str(int('1' + (len(s) - i - 1) * '0') + int(s))
res = int(res[:i+1] + (len(s) - i - 1) * '0')
break
if res == -1:
return(int(s))
else:
return(upper(str(res)))
def lower(s):
res = -1
for i in range(len(s)):
if int(s[i]) % 2 == 1:
res = int(s[:i] + str(int(s[i]) - 1) + (len(s) - i - 1) * '8')
break
if res == -1:
res = int(s)
return res
# print(lower('4436271')) # 4428888
# print(upper('4436271')) # 4440000
# print(upper('86912')) # 88000
# print(upper('6488962')) # 6600000
# print(upper('88892')) # 200000
# print(upper('91112')) # 200000
N = int(input())
for n in range(N):
sNum = input()
intNum = int(sNum)
l = intNum - lower(sNum)
u = upper(sNum) - intNum
res = l if l < u else u
print("Case #{}: {}".format(n+1, res))
And it finally works!

Attempt 1
Following is my first submission, which did not pass.
T = int(input())
for t in range(T):
isPlus = 1
str_num = input()
i = 0
for i in range(len(str_num)):
if i == len(str_num) - 1:
if int(str_num[i]) % 2:
isPlus = -1
else:
isPlus = -2
break
curr_digit = int(str_num[i])
if curr_digit % 2:
next_digit = int(str_num[i + 1])
if next_digit < 5 or curr_digit == 9:
# minus
isPlus = 0
break
res = 0
digits_left = len(str_num) - i - 1
current = int(str_num[i:])
if isPlus == 1:
target = int(str(int(str_num[i]) + 1) + '0' * digits_left)
res = target - current
elif isPlus == 0: # minus
target = int(str(int(str_num[i]) - 1) + '8' * digits_left)
res = current - target
elif isPlus == -1: # even originally
res = 1
else:
res = 0
print('Case #{}: {}'.format(t + 1, res))
Attempt 2
I find the hint to be more complicated than mine, but it provides me a more systematic way to solve this problem.

I tried to stick with this hint and tested every special case. It turned out that there are 2 special cases for the upper function – When there is a carry generated and when there is a series of carries rippling forward. To solve that, I implemented the upper function in a recursive manner.
def upper(s):
res = -1
for i in range(len(s)):
if int(s[i]) % 2 == 1:
if i == 0 and s[i] == '9':
res = int('10' + s[1:])
break
res = str(int('1' + (len(s) - i - 1) * '0') + int(s))
res = int(res[:i+1] + (len(s) - i - 1) * '0')
break
if res == -1:
return(int(s))
else:
return(upper(str(res)))
def lower(s):
res = -1
for i in range(len(s)):
if int(s[i]) % 2 == 1:
res = int(s[:i] + str(int(s[i]) - 1) + (len(s) - i - 1) * '8')
break
if res == -1:
res = int(s)
return res
# print(lower('4436271')) # 4428888
# print(upper('4436271')) # 4440000
# print(upper('86912')) # 88000
# print(upper('6488962')) # 6600000
# print(upper('88892')) # 200000
# print(upper('91112')) # 200000
N = int(input())
for n in range(N):
sNum = input()
intNum = int(sNum)
l = intNum - lower(sNum)
u = upper(sNum) - intNum
res = l if l < u else u
print("Case #{}: {}".format(n+1, res))
And it finally works!
