Нахождение идеальной pth степени числа с использованием Java, когда число является дробью - PullRequest
0 голосов
/ 01 сентября 2018

Мы говорим, что p - это совершенная p-я степень числа x, если x можно выразить как другое число b ^ p.

Т.е. если x = b ^ p, то p является идеальной p-й степенью x.

У меня мало случаев использования, где x может быть либо положительным целым числом, отрицательным целым числом или даже дробью. Первые два случая могут быть легко обработаны в java, но как найти идеальную p-ую степень числа x, используя java, когда x - это дробь. Не правда ли, что если x является дробью, мы можем просто использовать Math.sqrt (x) и получить число b такое, что b ^ 2 = x? Тогда 2 будет идеальной p-й степенью х. Этот случай даже действителен?

Я не обязательно ищу код, но логику, чтобы определить идеальную p-ую степень x в java, если x - это дробь. Также, пожалуйста, укажите причину, если кто-то считает это дело недействительным.

Ниже приведен код, который я написал для обработки случаев, когда x - это либо положительное целое число, либо число от 0 до 1. Но можем ли мы обработать случаи, когда x, например, для. 45,487,875515,54884 и т. Д.

public class PerfectPower {

public PerfectPower() {

    }

    public Integer getPerfectPower(double x){

        // x=b^p

        int p = 0;
        double b;

        if(x==0){
            throw new IllegalArgumentException("Cannot accept number 0.");
        }

        if (x > 1) {
            for (b = 2; b <= x; b++) {

                double value = 0;
                p = 1;

                while (value <= x) {

                    value = Math.pow(b, p);

                    if (value == x) {
                        return p;
                    } else if (value > x) {
                        break;
                    } else {
                        p++;
                    }
                }

            }
        } else if(x>0 && x<1){

            for (b = 2; (1/b) >= x; b++) {

                double value = 1;
                p = -1;

                while (value >= x) {

                    value = Math.pow(b, p);

                    if (value == x) {
                        return p;
                    } else if (value < x) {
                        break;
                    } else {
                        p--;
                    }
                }

            }

        }

        return null;

    }

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Мы можем сделать это простым способом, используя логарифмы. Это идет как ниже:

x = b^p    log(base b)x = p     log x/log b = p  

Таким образом, мы можем перебрать b = 2 - x и проверить, является ли p идеальным целым числом, и вернуть значение. Для десятичных случаев мы можем немного изменить формулу лога.

log b = (log x)/p    Hence b = 10^(log x)/p) 

В каждой итерации мы можем проверить, является ли b ^ p = x и возвращаем ли p. Я решил эту проблему, предполагая, что р должно быть целым числом. Однако для случаев, когда p может быть десятичным, а x между 0 и 1, это решение следует еще немного изменить. Ниже мой код, который я реализовал в Scala.

def perfectpowerlog(x: Double): Double = {
    var i: Double = 2
    var n: Double = 1
    var p: Double = 0
    val loop = new Breaks
    if (x == 1) {
        return n
    }
    if (x.ceil == x) {
        loop.breakable {
            while (i<=x) {
                p = math.log(x)/math.log(i)
                if (p.toInt == p) {
                    n = p
                    loop.break()
                }
                else
                    i=i+1
            }
        }
    }
    else {
        loop.breakable {
            while(i<=x.ceil) {
                p = pow(10,(log10(x)/i))
                if(pow(p,i) == x) {
                    n = i
                    loop.break()
                }
                else
                    i = i+1
            }
        }
    }
    return n
}
0 голосов
/ 01 сентября 2018

Поскольку 45 487,875 515 548 84 (для примера) не является целочисленным, единственный способ выразить это через b ^ p, где b и p являются целыми, это если p отрицательно. То есть, вашим числом может быть квадратный корень, корень куба, четвертый корень и т. Д. Некоторого (большого) целого числа.

Первый вопрос - это вопрос точности. Ваш номер не может быть представлен точно в двойном Java. Вы можете использовать BigDecimal. Это также не может быть точно корнем некоторого целого числа, поэтому вам нужно будет принять допуск, чтобы принять.

Насколько я могу судить, ваша большая проблема в том, что диапазон возможных значений p бесконечен. Возможно даже, что все числа достаточно близки к корню pth некоторого (большого) целого числа, которое вы не сможете разумно различить; Я не знаю, и это, безусловно, зависит от вашей терпимости.

Я думаю, что лучшее, что вы можете попробовать, это поднять свой номер до 2, 3, 4 и т. Д. И посмотреть, когда вы приблизитесь к целому числу. Если ваше число, возведенное в степень q, достаточно близко к целому числу, верните -q в качестве значения p. И прекрати поиски, пока не потерял терпение. : -)

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