Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача Числа Рамануджана Python

Дмитрий Таранец Знаток (413), на голосовании 3 года назад
Вообще не понимаю, как решить эту задачу .
Риниваса Рамануджан – индийский математик, славившийся своей интуицией в области чисел. Когда английский математик Годфри Харди навестил его однажды в больнице, он обмолвился, что номером такси, на котором он приехал, было 17291729, такое скучное и заурядное число. На что Рамануджан ответил: "Нет, нет! Это очень интересное число. Это наименьшее число, выражаемое как сумма двух кубов двумя разными способами". Другими словами:
1729 = 1^3 + 12^3 = 9^3 + 10^3.
1729 =1^3+12 ^3=9 ^3+10 ^3
.
Напишите программу, которая находит аналогичные интересные числа. В ответе запишите первые 5 чисел в порядке возрастания, включая число 17291729.
Голосование за лучший ответ
Elepsis Eclipse Гений (67303) 3 года назад
cache = {}
twice = {}

a = 0
while len(twice) < 5:
    a += 1
    b = 0
    while b < a:
        b += 1
        n = a ** 3 + b ** 3

        if n in cache:
            twice[n] = [cache[n], [a, b]]
        else:
            cache[n] = [a, b]

for n in twice: print(n, twice[n])

"""
1729 [[10, 9], [12, 1]]
4104 [[15, 9], [16, 2]]
13832 [[20, 18], [24, 2]]
20683 [[24, 19], [27, 10]]
32832 [[30, 18], [32, 4]]
"""
ФБЛ ПроверкаУченик (100) 2 года назад
Здорово! Доступно и шустро!
Антон РеутПрофи (574) 11 месяцев назад
Да, работает шустро, аналог на джаве даже медленнее. Также есть интересные случаи этих чисел, которые потеряются в таком варианте: [87539319, 167, 436, 228, 423, 255, 414]
Elepsis Eclipse Гений (67303) Антон Реут, Чу-то 167 никак не получается суммой двух кубов... остальные не стал проверять)
Алан ДжанибековГуру (3474) 7 месяцев назад
вспомнил логин от старого аккаунта только чтобы написать, что код невероятно классный с точки зрения алгоритма)
Elepsis Eclipse Гений (67303) Алан Джанибеков, ._. Ничосе, спасибо))
Black Afgano Просветленный (22332) 3 года назад
import numpy as np
from itertools import combinations

numbers = np.arange(100)
pairs = np.array(list(combinations(numbers, 2)))
sums = np.apply_along_axis(lambda x: sum(x ** 3), 1, pairs)

nums, counts = np.unique(sums, return_counts=True)
print(*[num for num, count in zip(nums, counts) if count == 2][:5])
Лука Майский Ученик (194) 3 года назад
Вообще то в задаче на Степике было начальное число 1729
b = 1729
x = 0
ss = [b]
while x != 33:
for x in range(1, 34):
for y in range(1, 34):
for z in range(1,34):
for t in range(1, 34):
for r in range(1, 34):
if (x**3 + y**3) == (z**3+t**3):
if x != y and x != z and x != t and y != z and y != t and z != t:
a = (x ** 3 + y ** 3)
if a != b:
if a not in ss:
ss.append(a)
ss.sort()
b = a
print(ss)

"
[1729, 4104, 13832, 20683, 32832]
"

отступы тут не ставятся, сам расставишь если не совсем того... ))
Денис Проходский Знаток (366) 3 года назад
numbers = []
for a in range(1, 50):
for b in range(1, 50):
if a == b:
continue
for c in range(1, 50):
if c == a or c == b:
continue
for d in range(1, 50):
if d == c or d == b or d == a:
continue
if a**3 + b**3 == c**3 + d**3:
i = a**3 + b**3
if i not in numbers:
numbers.append(i)
print(numbers)
,,,,
[1729, 4104, 13832, 39312, 46683, 32832, 110656, 110808, 40033, 20683, 65728, 64232]
Александр Фролов Ученик (103) 2 года назад
answer=[]
for i in range(1, 33):
____for j in range(1, 33):
________for x in range(1, 33):
____________for y in range(1, 33):
________________if i ** 3 + j ** 3 == x ** 3 + y ** 3 and i < x < y < j:
____________________answer.append(x ** 3 + y ** 3)
print(sorted(answer))

''''
[1729, 4104, 13832, 20683, 32832]
''''
ООО АлюконУченик (181) 2 года назад
Самый оптимальный код на поиск этих чисел
Elepsis Eclipse Гений (67303) ООО Алюкон, Это как считать, у меня 528 итераций, но жрет чуть больше памяти (думаю не критично), а здесь 1048576 итераций и почти не жрет память. Плюс, прямо в коде от балды писать 33 - не очень "по прогерски". Попросят найти не 5 чисел, а 6 - надо будет сидеть и искать какое там идет после 33 =)
УсяКуся Профи (561) 2 года назад
Это все здорово, но на степике к этому моменту мы ещё не прошли массивы. Как это решить без массивов?
wmzЗнаток (251) 1 год назад
синтаксис name = [] - это объявление пустого списка.
массив в питоне подключается import array и при объявление указывается тип данных - array('i', [-1, 1, 2, 6, 3, 4]) где i - integer + свои методы + хранится как непрерывная последовательность ячеек в памяти.
Списки называют массивом потому что массивы поддерживают списочные методы и по работе через те жи индексы схожи, но они отличаются между собой и по способу представления объектов в памяти и по типу хранимых объектов.
УсяКусяПрофи (561) 1 год назад
Мне это известно, но эта задача из курса на степике, и к тому моменту массивы не были пройдены, то есть решение должно быть другим
Игнасио Гутфритич Липездрюк Знаток (267) 2 года назад
for i in range(1, 33):
for j in range(1, 33):
for x in range(1, 33):
for y in range(1, 33):
if i ** 3 + j ** 3 == x ** 3 + y ** 3 and i < x < y < j:
answer = (x ** 3 + y ** 3)
print(answer)
1729
4104
13832
32832
20683
Ващенко Ученик (136) 1 год назад
Мой вариант с выводом только пяти чисел начиная с 1729 по возрастанию. Как сказано на степике.

counter, flag = 1, False
for a in range(1, 41):
__for c in range(1, a):
____for d in range(1, c + 1):
______for b in range(1, d):
________if a ** 3 + b ** 3 == d ** 3 + c ** 3:
__________print(a ** 3 + b ** 3)
__________counter += 1
__________if counter == 6:
____________flag = True
____________break
__if flag:
____break
Похожие вопросы