#python #math
Вопрос:
У меня проблема с заданием. Задача состоит в том, чтобы:
Мы говорим, что число 1-это супер-число. Если число x супер, то числа 2x и 3x также супер. Например, поскольку число 1 супер, то числа 2 и 3 супер. Поскольку 2 и 3 супер, то числа 4, 6 и 9 супер и так далее. В то же время числа 10 и 7 не являются супер. Напишите программу, которая просит пользователя ввести натуральное число n. Программа печатает, является ли введенный номер супер.
И это то, что я делал до сих пор
num = int(input("Enter a natural number ")) if num lt;= 0: print("That is not a natural number") else: if num % 5 == 0 or num % 7 == 0 or num % 11 == 0 or num % 13 == 0: print("Number is not super.") elif num == 1 or num % 2 == 0 or num % 3 == 0 or num % 8 == 0 or num % 9 == 0: print("Number is super") else: print("Number is not super.")
Проблема в том, что для некоторых чисел, таких как 62, говорится, что это супер-число, но это не так..
Комментарии:
1. Не очевидно, как условия в вашей программе вытекают из описания задачи. Может быть, математика неверна? Задача звучит для меня так, как будто идея состоит в том, чтобы решить ее с помощью рекурсии, а не решения в закрытой форме, потому что, является ли число
n
супер, зависит от тогоn/2
,n/3
является ли оно супер2. По-вашему, что
num % 5 == 0
, по-вашему, означает? Как ответ на этот вопрос поможет вам решить, является ли число супер? Другими словами, какой логический процесс вы хотите использовать, чтобы определить, является ли число супер? Похоже, у вас действительно есть вопрос по математике / теории чисел, а не по программированию.3. (Подсказка: что особенного в цифрах
5
,7
,11
и13
? Можете ли вы придумать еще числа, которые принадлежат этой последовательности? Понимаете ли вы, почему это создает проблему для вашего подхода?) (Подсказка: знаете ли вы, что такое простая факторизация ? Что такое первичная факторизация62
?)4. @lucidbrot вы имеете в виду разделить его на 2 или 3, пока я не достигну 1 ?
5. (Я не предлагал конкретного предложения — хотя мог бы, — а просто задавал сократические вопросы, чтобы направить мысль.)
Ответ №1:
Просто следуя определению супер-числа:
def is_super(k): if k == 1: return True if k % 2 == 0: return is_super(k / 2) if k % 3 == 0: return is_super(k / 3) return False
Некоторые испытания
print(is_super(9)) True print(is_super(14)) False print(is_super(32)) True print(is_super(62)) False
Ответ №2:
Для меня это выглядит так, как будто вы прыгнули, не выяснив сначала, как вы будете работать с этим вручную.
Лично я думаю, что самый простой способ начать это было бы рекурсивно, хотя это будет очень неэффективно с большими числами, поэтому вам решать, хотите ли вы пойти и оптимизировать его после выполнения первой версии. У меня это работает довольно легко, но поскольку это проблема, которую вам нужно решить, я не собираюсь просто копировать и вставлять ответ.
Это работает примерно так (psuedocode):
def is_super(i): if i is below 1: not a super if i is 1: is a super if i is above 1: check if i/2 or i/3 is a super
Комментарии:
1. Это немного странно. Что же
is_super(5)
делать? Как вы проверяете, является ли 5/2 или 5/3 супер?2. Я исходил из предположения о том , что он написал в задаче
1 is super
, и2x and 3x
это супер. Следуя этой логике, 5 не должно быть супер, потому что никакие супер-числа не могут быть умножены на 2 или 3, чтобы сделать это.3. Я специально был расплывчатым в этой части lol — поскольку все это довольно просто, если бы я был более точным, я мог бы просто написать код python в любом случае 😛 Это больше предназначалось в качестве базовой точки для работы
Ответ №3:
Здесь есть несколько хороших рекурсивных решений, я предложу нерекурсивное. Как намекают некоторые комментарии, супер-числа имеют контрольную факторизацию: все они имеют форму 2 x * 3 y для x, y gt;= 0, и каждое целое число этой формы является gt;супер-числом. Это должно стать ясным после некоторого изучения, потому что единственный способ получить супер-число-это умножить существующее на 2 или 3, и мы начнем с 1. Это приводит к следующему коду для проверки на превосходство:
def is_super(n: int) -gt; bool: if n lt; 1: return False while n % 3 == 0: n //= 3 return n amp; (n - 1) == 0; // Suggested by @KellyBundy
Я попытался найти кратчайший способ проверить себя на превосходство, но не смог найти ничего лучшего, чем это.
Комментарии:
1. Я думаю, вы могли бы удалить первый цикл и закончить
return n amp; (n-1) == 0
вместо этого.2. Или если бы числа были ограничены, скажем, 32-разрядными, тогда, может быть, просто
return 6**32 % n == 0
.3. @KellyBundy: это хорошее наблюдение, я добавлю его в свой ответ, когда у меня будет возможность позже.
Ответ №4:
num = int(input("Enter a natural number ")) if num lt;= 0: print("That is not a natural number") else: if num % 3 == 0: while num % 3 == 0: num = num / 3 print(num) if num == 1 or num % 2 == 0 or num % 3 == 0: print("Number is super") else: print("Number is not super") elif num % 2 == 0: while num % 2 == 0: num = num / 2 print(num) if num == 1 or num % 2 == 0 or num % 3 == 0: print("Number is super") else: print("Number is not super") else: print("Number is not super")
Это то, что я делал до сих пор, но я не думаю, что это сработает для больших чисел ?
Комментарии:
1. Попробуйте это на 30. Кажется ли вам результат правильным?
2. На самом деле, даже на 1 он возвращает неправильный результат.