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 radicalです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の平方根は、11の平方根の3倍として表すことができます。

次の2つの方法のいずれかを実行することをお勧めします。


    1. nの平方根を取ります。nが完全な平方である場合(つまり、nの平方根に10進値がない場合)、部首の下に何もない(または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--) 
      

      カウンターの2乗がnに均等に分割される場合(つまり、の線に沿ったものn % Math.pow(i,2)==0)、カウンターを部首の外側に置き、nを部首の内側のカウンターの2乗で割った値に戻ります(たとえば、n = 99で、カウンターが3の場合、 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
      

      ここで、siは2の累乗に等しくなります。

    3. ループを通過して、均等に分割される完全な正方形を見つけることができない場合、部首を単純化することはできません。


    1. 数値のすべての素因数を検索します(たとえば、99の素因数は3,3,11です)(ここで、数値の素因数を検索するためのサンプルC実装を見つけることができます。これは、適応するのがまったく難しいことではありません。 Javaへ)。

    2. リスト内の素因数のペア(3,3など)ごとに、部首の外側の数にその素因数を掛けます(したがって、3,3の場合は、外側の値に3を掛けます)。

    3. ペアに収まらないすべての素因数(11など)について、部首内の数にその素因数を掛けます。

お役に立てれば。これが完全にあなたが望むものではない場合は、申し訳ありません。

PS

最初のアルゴリズムを使用する場合でも、2番目のアルゴリズムがどのように機能するかを確認する必要があります。これは、素因数分解を使用しているためです。これは、手作業でこれを行うための便利な手法です。

于 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 に答える