Понимание Math в Java: метод, который возвращает степень 2 переданного Integer без использования класса Math Java - PullRequest
0 голосов
/ 26 августа 2018

Мои инструкции по решению проблемы: Создайте метод, который определяет, является ли целочисленный аргумент степенью 2. Он должен иметь следующий заголовок:

private static int powerOf2(int aNumber)

Если число, переданное в качестве аргумента вашему методу, является целой степенью 2, тогда верните степень. Если число, переданное в aNumber, не является целой степенью 2 (или не является положительным числом), верните -1. ​​

Не используйте методы из класса Math Java.

Мой вопрос: Я не понимаю, о чем просит проблема: вернуть степень 2 целого числа, а затем вернуть преобразованную мощность? Я даже не уверен, о чем идет речь.

Мой код:

private static int powerOf2(int aNumber)
{
    if(aNumber % 2 != 0)
    {
        return -1;
    }
    else
    {
        System.out.println(aNumber + " is 2 raised to ");
        while (((aNumber % 2) == 0) && aNumber > 0)
        {
            // While aNumber is even and > 0
            aNumber /= 2;

        }
        System.out.print(+ aNumber);
        return aNumber;

    }
}

Вывод: Действительно подробное объяснение того, что проблема просит меня сделать, и что значит проверить силу 2?

Ответы [ 6 ]

0 голосов
/ 26 августа 2018

Такой метод может использовать метод Integer.numberOfTrailingZeros (...) .Это дает мощность 2 , если число является целой степенью 2, и мы можем просто проверить, правы ли мы.

public static int powerOf2(int aNumber) {
    int trailingZeros = Integer.numberOfTrailingZeros(aNumber);
    if (aNumber == (1 << trailingZeros)) {
        return trailingZeros;
    } else {
        return -1;
    }
}
0 голосов
/ 26 августа 2018

Что означает вопрос, так это то, сколько умноженных на 2 единиц получит переданное вами число.

Если переданное число равно 8, то вы возвращаете 3, потому что три 2 умножены вместе, 2x2x2 равно 8.

Если бы не ограничение не использовать что-либо из класса Math, вы могли бы сделать это, просто сделав что-то вроде:

if (aNumber <0) return -1; int power = (int) (Math.log (aNumber) / Math.log (2)); return (int) Math.pow (2, power) == aNumber? мощность: -1; </p>

С этими ограничениями вы могли бы сделать кое-что в дополнение к тому, что сказали другие ответчики.

private static int powerOf2(int aNumber)
{
    if (aNumber == 0) return 0;
    if (aNumber < 0) return -1;

    int count = 0;
    while (aNumber != 0) {
        int shifted = aNumber >> 1;
        if (shifted * 2 != aNumber) return -1;
        aNumber = shifted;
        count++;
        if (aNumber == 1) {
            return count;
        }
    }
    return -1;
}
0 голосов
/ 26 августа 2018

Ваш метод должен возвращать число, представляющее показатель степени.

Если вы введете 8, программа должна вывести 3 (так как 2 x 2 x 2 = 8).Если вы вводите число, которое не является степенью 2 или является отрицательным, оно должно вывести -1.Надеюсь, что это имеет смысл!

0 голосов
/ 26 августа 2018

В математике основание ^ экспонента = термин

Например: 2 ^ 3 = 8 здесь база = 2, экспонента = 3 и термин = 8

То, что проблема даст вам, является терминоми что ему нужно, это показатель степени с основанием, установленным как 2. Необходимо иметь дело с тем, что термин может быть невозможным с целочисленными значениями для показателя степени

Например: 2 ^ 4.473 = 20 (приблизительно). Для таких случаеввам нужно, чтобы вы вернули -1, а для случаев с целочисленными показателями, которые являются совершенными степенями 2, требуется показатель

Посмотрите на код, чтобы понять

private static int powerOf2(int aNumber) {

        int cnt = 0;
        System.out.println(aNumber + " is 2 raised to ");
        while ((((aNumber % 2) == 0) && aNumber > 0)) {
            // While aNumber is even and > 0
            aNumber /= 2;
            cnt++;

        }
        if (aNumber == 1)
            return cnt;
        else
            return -1;

    }
0 голосов
/ 26 августа 2018

Вас просят проверить, является ли число, переданное в качестве аргумента функции, степенью 2, а если это так, то какова степень 2, которая суммирует до aNumber.(2^x = aNumber) - вы хотите найти x.

Например, если вы передадите 8 функции, вы должны вернуть 3, поскольку 2^3 = 8.Но если число не является степенью 2, вы должны вернуть -1 - например, если параметр равен 9, нет целой степени 2, которая может привести к 9.

Что касается вашей программы, выможет заставить его работать с некоторыми незначительными изменениями:

Что вы хотите сделать, это сделать цикл и на каждой итерации проверять, делится ли входное число на 2 (aNumber % 2 == 0), и делит ли оно надва (aNumber = aNumber / 2).Если вы можете добраться до 1 таким образом, это означает, что ваше число является степенью двойки, и вам просто нужно сосчитать итерации (количество раз, которое вы поделили aNumber на 2).Таким образом, ваша функция может выглядеть так:

private static int powerOf2(int aNumber)
{
    int power = 0;
    if(aNumber % 2 != 0)
    {
        return -1;
    }
    else
    {
        System.out.print(aNumber + " is 2 raised to ");
        while (true)
        {
            if(aNumber % 2 == 0){
            aNumber /= 2;
            power++;
            if(aNumber == 1) return power;
            }else{
                return -1;
            }

        }

    }
}
0 голосов
/ 26 августа 2018

Степень 2 означает, что вы можете получить число, умножив цифру 2, например:

  • Если вход равен 1, то вы должны вернуть 0, так как 2 0 = 1;

  • Если вход равен 2, то вы должны вернуть 1, так как 2 1 = 2 * 1 = 2;

  • Если вход равен 4, то вы должны вернуть 2, так как 2 2 = 2 * 2 = 4;

  • Если ввод 8, то вы должны вернуть 2, так как 2 3 = 2 * 2 * 2 = 8;

...

Если ввод 0 или отрицателен, вы должны вернуть -1;

Если на входе нет степени 2 (например, 3, 5, 7, 10), вы должны вернуть -1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...