2014-11-11 4 views
4

Как проверить, является ли число мощностью 5?Как проверить, является ли номер мощностью 5

Я мог придумать ниже алгоритм. Есть ли способ улучшить его? Любой математический трюк?

  1. Сначала проверьте, если последняя цифра 5.
  2. Если последняя цифра 5; разделите его на 5.
    Если результат деления равен 1, то число равно 5.
    Еще раз проверьте, является ли результат деления самой силой 5 (то есть перейдите к шагу 1 с результатом как число).
+5

Этот вопрос не соответствует теме, потому что это математический вопрос (и тот, который имеет достаточную документацию). – Mat

+2

Посмотрите на это: http://math.stackexchange.com/questions/22580/how-to-check-if-a-integer-is-a-power-of-some-integer –

+0

@mat, что вы предлагаете ? Удалить шаг и что делать? Что вы подразумеваете под не по теме. Если вы знаете какую-либо конкретную документацию, просто укажите на нее. Это поможет, чем такие комментарии. –

ответ

9

Вам не нужно смотреть на отдельные цифры, вы можете просто сделать это следующим образом:

n = (int)(log(x)/log(5)); // get n = log5(x), truncated to integer 
if (pow(5, n) == x)   // test to see whether x == 5^n 
    // x is a power of 5 

LIVE DEMO

+0

Звучит неплохо. Однако с точки зрения программирования/алгоритма метод «журнал» может быть недоступен на всех языках. –

+1

Правда - я не знаю какого-либо современного языка, который не имеет базовых математических функций, таких как 'log',' pow' и т. Д., Но вы никогда не знаете. И, конечно, вы всегда можете реализовать свои собственные версии, если язык их не поддерживает. –

4

Есть только несколько мощности из пяти, которые соответствуют в межд/длинный поэтому вам нужно просто сгенерировать их все и проверить один за другим (менее 60 номеров), используя HashSet будет иметь сложность времени O (1)

+0

Мой профессор CS использовал, чтобы дать мне числа в больших файлах, а не как int или long. –

+0

@TimothyHa, поэтому в HashSet вы можете хранить строки, BigNums или любое другое представление (например, хэш, арифметика модуля ...). Однако вы можете легко проверить это в O (lg n), не сохраняя результаты. Посмотрите [мой ответ] (http://stackoverflow.com/a/26869655/2349936). Pham Trung: +1, для написания решения O (1) (после предварительной обработки). – Tacet

2

Последовательное разделение, пока вы не достигнете числа, разделенного на 5 и проверьте, равен ли результат 1, это неплохое решение. Выполняют операции log_5 (n), поэтому это O (lg n), это очень хорошее время. Для 9094947017729282379150390625 это всего лишь 40 операций!

+0

Что такое ** n ** здесь в этом режиме? – Hengameh

+0

Это номер для проверки. (Предполагалось, что деление на 5 имеет сложность O (1).Это явно неверно для чисел с миллионами цифр, но у любого алгоритма есть эта проблема, поэтому я пропустил это.) В том числе размер числа будет около O (lg^2 n). – Tacet

0

Что бы я сделал, сначала создайте массив чисел с степенями 5. Вы можете использовать диапазон, а затем сказать, для каждого значения в диапазоне, принять это значение в пятую степень и нажать новый значение в массив.

После этого вы обнаружите, что n, номер, который вы ищете, включен в массив.

Смежные вопросы