Упростите радикальное выражение в Java - PullRequest
1 голос
/ 19 марта 2011

Вот мой метод до сих пор:

public static int[] simplifyRadical(int number) {
    int[] result = new int[2];
    for (int i = 1; i < number / 2; i++) {
        if ((i % number == 0)) {
            //IS a factor of the number in the radical
        }
    }
    return result;
}

Я использую формат result[0] = number outside radical и result[1] = number inside radical.До сих пор мой метод получает все факторы number (что является начальным НЕПРАВИЛЬНЫМ числом в радикале).Итак, как я могу разделить начальный number на идеальный квадрат, получить квадратный корень из этого и умножить это на мою переменную result[0].Затем продолжайте цикл, пока не будут найдены идеальные квадраты.Извините, если этот вопрос сбивает с толку читать, это было определенно запутанно писать.Если вам нужны какие-либо пояснения, пожалуйста, прокомментируйте ниже.
ОБНОВЛЕНИЕ:
Математически я превращаюсь: sqrt(50) в 5 sqrt(2), потому что sqrt(50) = sqrt(25 * 2) и 25 - это идеальный квадрат 5таким образом: 5 sqrt(2) формируется.

Ответы [ 2 ]

4 голосов
/ 19 марта 2011

Если я вас правильно понимаю, вы хотите радикально упростить. Как, например, квадратный корень из 99 может быть выражен как 3 x квадратный корень из 11.

Я бы порекомендовал сделать это одним из двух способов:


    1. Возьмите квадратный корень из n. Если n является идеальным квадратом (то есть квадратный корень из n не имеет десятичного значения), то мы просто возвращаем значение квадратного корня с ничем (или 1) под радикалом. Else ...

    2. Цикл между квадратным корнем из n, округленным до 2. Что-то вроде:

      double nSquareRoot = Math.sqrt(n);
      int squareRootRounded = (int)nSquareRoot;
      //Here goes the first step of the algorithm
      //...
      for (int i = squareRootRounded; i>1; i--) 
      

      Если квадрат счетчика делится равномерно на n (то есть что-то по линиям n % Math.pow(i,2)==0), то вернитесь со счетчиком вне радикала, а n разделите на квадрат квадрата внутри радикала (например, если n = 99 и счетчик на 3, вы бы поместили 3 снаружи и 99/9 или 11 внутри). Или в коде, как только вы определили, что i, в степени два, делится равномерно на n:

      result[0] = i; //Set outside the radical to the counter
      result[1] = n/s; //Set inside the radical to the n divided by s
      

      , где s равно i степени два.

    3. Если вы проходите через цикл и не можете найти идеальный квадрат, который делится равномерно, то ваш радикал не может быть упрощен.


    1. Найдите все простые множители числа (например, главные факторы 99 - 3,3,11) (вы можете найти пример реализации C для нахождения простых множителей числа здесь , что совсем не сложно адаптировать к Java).

    2. Для каждой пары простых факторов в вашем списке (например, 3,3) умножьте число вне радикала на этот простой фактор (поэтому для 3,3 вы умножите свое внешнее значение на 3).

    3. Для каждого простого фактора, который не вписывается в пару (например, 11), умножьте число внутри радикала на этот простой фактор.

Надеюсь, это поможет. Если это совсем не то, что вы хотите, извините.

PS

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

1 голос
/ 19 марта 2011

Также, если вы используете result[0] и result[1], тогда ваша декларация должна быть:

double[] result = new double[2];

instead of

double[] result = new double[1];
...