for i in range(10, 51):
for j in range(2, 99 // i + 1):
n = i * 1000 + j * 100 + i * j
if len(set(str(n))) == 5: print(n)
Средняя цифра не может быть меньше 2, т.к. это гарантирует повтор цифр и не может быть больше 99 // k, где k - число, образованное первыми двумя цифрами.
Для второго задания придётся изменить схему проверок:
for i in range(1, 5):
for j in range(i + 1, 7):
for k in range(j + 1, max(8, 99 // (10 * i + j) + 1)):
t = (10 * i + j) * k
if k < t // 10 < t % 10: print(i, j, k, t, sep='')
Это если ты хочешь искать числа эффективно.
Но если тупо в лоб, то всё намного проще:
for i in range(10000, 100000):
s = str(i)
if len(set(s)) != 5: continue
if i // 1000 * (i // 100 % 10) == i % 100: print(i)
for i in range(10000, 100000):
s = str(i)
if len(set(s)) != 5 or not (s[0] < s[1] < s[2] < s[3] < s[4]): continue
if i // 1000 * (i // 100 % 10) == i % 100: print(i)