Форум программистов, компьютерный форум, киберфорум
alhaos
Войти
Регистрация
Восстановить пароль
Оценить эту запись

ЗАДАЧА Является ли число степенью двойки

Запись от alhaos размещена 19.02.2021 в 09:01

Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае.
Операцией возведения в степень пользоваться нельзя!

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function foo{
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        $number
    )
 
    if ($number -isnot [int]){
        Return "NO"
    }
    
    if ($number -le 2){
        Return "YES"
    }
 
 
    foo ($number / 2)
}
 
0..100 | ForEach-Object {
    "{0:d3}: {1}" -f $_, (foo -number $_)
}
Размещено в Без категории
Просмотров 688 Комментарии 14
Всего комментариев 14
Комментарии
  1. Старый комментарий
    А почему бы для начала не вычислить логарифм по основанию 2. Если полученное число "далеко" от целого, то считать далее ничего не нужно.
    Запись от wer1 размещена 19.02.2021 в 10:26 wer1 вне форума
  2. Старый комментарий
    PowerShell
    1
    2
    3
    
    0..100 | Where-Object {
        -not (.{$args[0] - [math]::Floor($args[0])} ([math]::Log2($_)))
    }
    да вы читер )))
    Запись от alhaos размещена 19.02.2021 в 14:28 alhaos вне форума
  3. Старый комментарий
    Думаю если pow юзать нельзя log2 тем более
    Запись от alhaos размещена 19.02.2021 в 14:31 alhaos вне форума
  4. Старый комментарий
    А почему бы не использовать деление на 4. Полагаю, что условие при котором получается результат 1 или 2 записать в программу несложно? Зато счёт в два раза быстрее. Или вы думаете иначе?
    Запись от wer1 размещена 19.02.2021 в 16:47 wer1 вне форума
  5. Старый комментарий
    что то я совсем об этом не подумал, надо помозговать...
    Запись от alhaos размещена 19.02.2021 в 20:09 alhaos вне форума
  6. Старый комментарий
    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 alhaos вне форума
  7. Старый комментарий
    с восьмёркой уже не существенно

    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 вне форума
    Обновил(-а) alhaos 20.02.2021 в 08:47
  8. Старый комментарий
    а так: m and (m-1) = 0 -> m степень двойки для m>1
    Запись от Аватар размещена 21.02.2021 в 09:50 Аватар вне форума
  9. Старый комментарий
    Э..., боюсь, если хотите чтобы я проверил, придется немного разжевать для меня, мало, что понимаю в вашем сообщении.
    Запись от alhaos размещена 21.02.2021 в 13:47 alhaos вне форума
  10. Старый комментарий
    как это легко заметить по моим решениям я еще только учусь.
    Запись от alhaos размещена 21.02.2021 в 13:48 alhaos вне форума
  11. Старый комментарий
    То самый быстрый способ проверки. В двоичной записи степень двойки это единица и нули справа. Если вычесть единицу, то вместо первой единицы станет нуль, а все нули справа станут единицами. И логическая операция И над степенью двойки и ей же без единицы все в нолик превратит. Но только для степени двойки. Вот и предлагаю проверить и сравнить время
    Запись от Аватар размещена 21.02.2021 в 14:15 Аватар вне форума
  12. Старый комментарий
    как же я узко мыслю... (((

    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 вне форума
    Обновил(-а) alhaos 21.02.2021 в 16:11
  13. Старый комментарий
    От ТС:
    как же я узко мыслю... (((
    ...
    А может в PowerShell есть ещё специальная функция переводящая десятичное число в двоичное? Или хотя бы в 8-ричное... Что тоже можно использовать для решения вашей задачи.
    Запись от wer1 размещена 21.02.2021 в 17:16 wer1 вне форума
  14. Старый комментарий
    в самом 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 вне форума
    Обновил(-а) alhaos 21.02.2021 в 17:58
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.