1

到目前为止,这是我的方法:

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 radicaland result[1] = number inside radical。到目前为止,我的方法得到了所有的因子number(即部首中的初始 UNSIMPLFIED 数)。那么如何将初始值number除以完美平方,得到平方根并将其乘以我的result[0]变量。然后继续循环,直到找不到完美的正方形。很抱歉,如果这个问题读起来令人困惑,写起来肯定令人困惑。如果您需要任何澄清,请在下面发表评论。
更新:
所以在数学上我正在变成:sqrt(50)因为5 sqrt(2)sqrt(50) = sqrt(25 * 2)25 是 5 的完美平方,因此:5 sqrt(2)形成。

4

2 回答 2

4

如果我理解正确,您想简化一个部首。例如,99 的平方根可以表示为 3 x 11 的平方根。

我建议采用以下两种方式之一:


    1. 取 n 的平方根。如果 n 是一个完全平方(即 n 的平方根没有十进制值),那么我们只返回根号下没有任何内容(或 1)的平方根值。别的...

    2. 在四舍五入为 2 的 n 的平方根之间向下循环。类似于:

      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,则您'd 将 3 放在外面,将 99/9 或 11 放在里面)。或者在代码中,一旦您确定 i 的 2 次方均分为 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 的 2 次方。

    3. 如果你通过循环并且找不到一个完美的正方形,那么你的根就不能被简化。


    1. 找到一个数的所有质因数(例如,99 的质因数是 3,3,11)(你可以在这里找到一个用于找到一个数的质因数的示例 C 实现这应该不难适应到Java)。

    2. 对于列表中的每一对素因子(如 3,3),将根号之外的数字乘以该素因子(因此对于 3,3,您将外部值乘以 3)。

    3. 对于每个不适合成对的素数(如 11),将根号内的数字乘以该素数。

希望这可以帮助。如果这完全不是你想要的,对不起。

附言

即使你使用第一个算法,你仍然应该看看第二个算法是如何工作的,因为它使用素数分解,这是一种有用的手工技术。

于 2011-03-19T17:55:12.527 回答
1

此外,如果您正在使用result[0]result[1]那么您的声明应该是:

double[] result = new double[2];

instead of

double[] result = new double[1];
于 2011-03-19T17:50:31.293 回答