Если я вас правильно понимаю, вы хотите радикально упростить. Как, например, квадратный корень из 99 может быть выражен как 3 x квадратный корень из 11.
Я бы порекомендовал сделать это одним из двух способов:
Возьмите квадратный корень из n. Если n является идеальным квадратом (то есть квадратный корень из n не имеет десятичного значения), то мы просто возвращаем значение квадратного корня с ничем (или 1) под радикалом. Else ...
Цикл между квадратным корнем из 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 степени два.
Если вы проходите через цикл и не можете найти идеальный квадрат, который делится равномерно, то ваш радикал не может быть упрощен.
Найдите все простые множители числа (например, главные факторы 99 - 3,3,11) (вы можете найти пример реализации C для нахождения простых множителей числа здесь , что совсем не сложно адаптировать к Java).
Для каждой пары простых факторов в вашем списке (например, 3,3) умножьте число вне радикала на этот простой фактор (поэтому для 3,3 вы умножите свое внешнее значение на 3).
Для каждого простого фактора, который не вписывается в пару (например, 11), умножьте число внутри радикала на этот простой фактор.
Надеюсь, это поможет. Если это совсем не то, что вы хотите, извините.
PS
Даже если вы работаете с первым алгоритмом, вы все равно должны взглянуть на то, как работает второй алгоритм, так как он использует простое разложение , полезный метод для выполнения этого вручную.