«супер» число в python

#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 он возвращает неправильный результат.