Brain-Teaser 870: Think of a number
From The Sunday Times, 9th April 1978 [link]
Think of a two-digit whole number”, said Martin.
“Right”, said Sue.
“Double it, add 10, divide by the number you first thought of, subtract 2, divide by 10 and take the reciprocal — what did you get?”
“A positive finite number greater than one”, said Sue.
“Don’t be difficult”, said Martin, “what was your answer?”
Sue told him — precisely.
“It can’t be”, said Martin.
“You’re right”, laughed Sue, “I missed out one step!”
Martin thought: “It’s still impossible for me to tell you the number you started with.”
“I’ll help you”, said Sue. “If I had missed out two steps, including the one already missed out, the answer could have been one hundredth of the number I first thought of.”
What was the number?
This puzzle is included in the book The Sunday Times Book of Brain-Teasers: Book 1 (1980). The puzzle text above is taken from the book.
[teaser870]





Jim Randell 11:16 am on 2 September 2026 Permalink |
If the procedure is followed correctly, the series of operations results in a value that is the same as the input value.
Martin says: “It can’t be”, so we are interested in results that can be made by missing out one of the steps, but are not 2-digit whole numbers (10 – 99).
The following Python program examines possible input numbers and missing steps to find situations where the results is a finite number, greater than one, that is not a possible start number.
It then looks to situations where knowing the result of the process is not enough information to determine the starting number. And from the remaining candidates it looks for situations where also missing out an additional step can give a result that is 1/100th the starting number.
It runs in 78ms. (Internal runtime is 1.5ms).
from enigma import (Rational, irange, filter_unique, unpack, empty, seq2str, printf) Q = Rational() # process number <n>, missing out steps <xs> def process(n, xs=empty): r = Q(n) try: if 1 not in xs: r *= 2 # double it if 2 not in xs: r += 10 # add 10 if 3 not in xs: r /= n # divide by the number you first thought of if 4 not in xs: r -= 2 # subtract 2 if 5 not in xs: r /= 10 # divide by 10 if 6 not in xs: r = Q(1, r) # take the reciprocal return r except ArithmeticError: return None # possible start numbers (2-digit) starts = set(irange(10, 99)) # record possible (<start number>, <missing step>, <result>) values> ss = list() # consider the missing step for k in irange(1, 6): # start with a 2-digit number for n in starts: r = process(n, {k}) if r is None or not (r > 1) or r in starts: continue #printf("{k}: {n} -> {r}") # record (<missing step>, <start number>) by result ss.append((n, k, r)) # knowing the result is not enough to determine the start number ss = filter_unique(ss, unpack(lambda n, k, r: r), unpack(lambda n, k, r: n)).non_unique for (n, k, r) in ss: printf("[start {n}, miss {k} -> result {r}]") # look for an additional step to miss that gives a result of n/100 for k1 in irange(1, 6): if k1 == k: continue r1 = process(n, {k, k1}) if r1 is not None and 100 * r1 == n: printf("-> start {n}; miss {ks}; result {r1}", ks=seq2str([k, k1], sort=1, enc="")) printf()Solution: Sue’s starting number was 20.
There are only 4 candidates where missing a step will lead to a viable result:
So Sue told Martin “4”, or “4.5”.
If he had been told “4.5” he would know that the starting number was 45 (although not which step was missed).
So he must have been told “4” and the starting number was 20 or 40.
Starting with 20 and missing steps 3 and 4, gives a result of 0.2 = 20/100.
LikeLike