?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Flag Next Entry
6174 Капрекара
nyaload
_winnie
число 6174, есть в нём что-то мистическое и тайное.
Возмите любое четырехзначное число с неодинаковыми цифрами, переставьте цифры так что бы получилось наименьшее и наибольшие числа, и вычтите. Не более чем через 7 шагов последовательность сойдётся к 6174, и никто не знает почему.

Например: 1234 -> 8352 -> 6174 -> ....

Информация: http://en.wikipedia.org/wiki/Kaprekar_constant

Python:
i = 1234
for _ in range(10):
   x = ''.join(sorted('%04i' % i))
   i = int(x[::-1]) - int(x)
   print i

upd: подробное описание: http://plus.maths.org/content/os/issue38/features/nishiyama/index
Tags:


  • 1
Хм.

Любопытно.

Написал код для проверки.
Оказывается, для чисел из 3 цифр то же выполняется. Там получается число 495.

Вот код:

from itertools import product
from pprint import pprint

nums = '0123456789'
digits = 3
limit_of_iterations = 10

excluded_numbers_list = []
fit_numbers_set = set([])
all_numbers_set = set([])

def combinations_with_replacement(iterable, r):
# combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
# This function is in the module itertools from Python 2.7
pool = tuple(iterable)
n = len(pool)
for indices in product(range(n), repeat=r):
if sorted(indices) == list(indices):
yield tuple(pool[i] for i in indices)

def int_to_list(combination_int):
L = list(str(combination_int))
if len(L) < digits:
L.extend(list('0'*(digits-len(L))))
return L

def list_to_str(combination):
return ''.join(sorted(combination))

for combination in combinations_with_replacement(nums,digits):
if len(set(combination)) == 1: #two or more digits have to be different
combination_int = int(list_to_str(combination))
excluded_numbers_list.append(combination_int)
print("--: {0:0{1}} doesn't fit the properties".format(combination_int,digits))
print("\n")
continue
print("In: {0}".format(list_to_str(combination)))
all_numbers_set.add(combination)
combination_list = combination
last_int = -1
for i in xrange(1,limit_of_iterations):
combination_str = list_to_str(combination_list)
combination_int = int(combination_str[::-1]) - int(combination_str)
if combination_int == last_int:
fit_numbers_set.add(combination)
print("{0:2}->{1:0{2}}".format(i,combination_int,digits))
break
last_int = combination_int
print("{0:2}: {1:0{2}}".format(i,combination_int,digits))
combination_list = int_to_list(combination_int)
print("\n")

print("Excluded numbers:")
pprint(excluded_numbers_list)

print("Unfit numbers:")
pprint(all_numbers_set - fit_numbers_set)

  • 1