ЗАДАЧА Является ли число степенью двойки
Запись от alhaos размещена 19.02.2021 в 09:01
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае. Операцией возведения в степень пользоваться нельзя!
|
Всего комментариев 14
Комментарии
-
А почему бы для начала не вычислить логарифм по основанию 2. Если полученное число "далеко" от целого, то считать далее ничего не нужно.
Запись от wer1 размещена 19.02.2021 в 10:26 -
да вы читер )))
PowerShell 1 2 3
0..100 | Where-Object { -not (.{$args[0] - [math]::Floor($args[0])} ([math]::Log2($_))) }
Запись от alhaos размещена 19.02.2021 в 14:28 -
Думаю если pow юзать нельзя log2 тем более
Запись от alhaos размещена 19.02.2021 в 14:31 -
А почему бы не использовать деление на 4. Полагаю, что условие при котором получается результат 1 или 2 записать в программу несложно? Зато счёт в два раза быстрее. Или вы думаете иначе?
Запись от wer1 размещена 19.02.2021 в 16:47 -
что то я совсем об этом не подумал, надо помозговать...
Запись от alhaos размещена 19.02.2021 в 20:09 -
PowerShell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
function foo { param ( # input number [Parameter(Mandatory)] [object] $number ) switch ($number) { { $_ -isnot [int] } { return "NO" } { $_ -le 2 } { return "YES" } Default { foo ($number / 2) } } } (Measure-Command { (1..10000).ForEach{ [void] (foo $_) } } ).TotalMilliseconds
Код:1603,0722
PowerShell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
function foo { param ( # input number [Parameter(Mandatory)] [object] $number ) switch ($number) { { $_ -isnot [int] } { return "NO" } { $_ -in 1, 2 } { return "YES" } 3 { return "NO" } Default { foo ($number / 4) } } } (Measure-Command { (1..10000).ForEach{ [void] (foo $_) } } ).TotalMilliseconds
Код:1174,865
Запись от alhaos размещена 20.02.2021 в 07:27 -
с восьмёркой уже не существенно
PowerShell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
function foo { param ( # input number [Parameter(Mandatory)] [object] $number ) switch ($number) { { $_ -isnot [int] } { return "NO" } { $_ -in 1, 2, 4 } { return "YES" } { $_ -in 3, 5, 6, 7 } { return "NO" } Default { foo ($number / 8) } } } (Measure-Command { (1..10000).ForEach{ [void] (foo $_) } } ).TotalMilliseconds
Код:1158,2059
Запись от alhaos размещена 20.02.2021 в 08:46
Обновил(-а) alhaos 20.02.2021 в 08:47 -
а так: m and (m-1) = 0 -> m степень двойки для m>1
Запись от Аватар размещена 21.02.2021 в 09:50 -
Э..., боюсь, если хотите чтобы я проверил, придется немного разжевать для меня, мало, что понимаю в вашем сообщении.
Запись от alhaos размещена 21.02.2021 в 13:47 -
как это легко заметить по моим решениям я еще только учусь.
Запись от alhaos размещена 21.02.2021 в 13:48 -
То самый быстрый способ проверки. В двоичной записи степень двойки это единица и нули справа. Если вычесть единицу, то вместо первой единицы станет нуль, а все нули справа станут единицами. И логическая операция И над степенью двойки и ей же без единицы все в нолик превратит. Но только для степени двойки. Вот и предлагаю проверить и сравнить время
Запись от Аватар размещена 21.02.2021 в 14:15 -
как же я узко мыслю... (((
PowerShell 1 2 3 4 5 6 7 8 9 10 11 12 13 14
function foo { param ( # input number [Parameter(Mandatory)] [object] $number ) return $number -band $number - 1 ? "NO" : "YES" } (Measure-Command { (1..10000).ForEach{ [void] (foo $_) } } ).TotalMilliseconds
Код:527,1577
Запись от alhaos размещена 21.02.2021 в 16:01
Обновил(-а) alhaos 21.02.2021 в 16:11 -
От ТС:
как же я узко мыслю... (((
...
А может в PowerShell есть ещё специальная функция переводящая десятичное число в двоичное? Или хотя бы в 8-ричное... Что тоже можно использовать для решения вашей задачи.Запись от wer1 размещена 21.02.2021 в 17:16 -
в самом PowerShell не припомню такого, но нам доступны классы .Net
PowerShell 1 2 3 4 5 6 7
0..9 | ForEach-Object { [PSCustomObject]@{ dec = $_ bin = [System.Convert]::ToString($_, 2) oct = [System.Convert]::ToString($_, 8) } }
Код:dec bin oct --- --- --- 0 0 0 1 1 1 2 10 2 3 11 3 4 100 4 5 101 5 6 110 6 7 111 7 8 1000 10 9 1001 11
Запись от alhaos размещена 21.02.2021 в 17:56
Обновил(-а) alhaos 21.02.2021 в 17:58