-1

数値 N のすべての約数 D(配列) を見つけようとすると、D の各 d の約数も D の計算で自動的に計算されます。数値 N のすべての約数を見つける方法はありますか?すべての約数の約数を見つけ、最後にそれらを合計します。もちろん方法はありますが、繰り返し計算をしない方法が欲しいです。これは再帰でできると思いますが、どうすればよいかわかりません。数値 N のすべての約数を計算する実装を提供しています。N の約数を計算しながら、すべての約数の約数も計算 (および保存) するように拡張したいと考えています。最後に、それらを合計して、必要なものを取得できます。しかし、プロセス全体で有益な点は、余分な努力なしですべての約数の約数も取得したことです (つまり、

function divisors_of_a_number($n)//returns all the divisors of a number in an unsorted array
{
$i=1;
$s=bcsqrt($n);
while($i<=$s)
{
if(!(bcmod($n,$i)))
{
    $a[]=$i;
    if($i!=$s)
    $a[]=bcdiv($n,$i);
}
++$i;
}
return $a;
}

これを明確にする例を次に示します。たとえば、N は 6 です。したがって、N の約数は {1,2,3,6} です。ここで、「3」は N の約数です。これは、「3」を割る数 (つまり、その約数) も N を割ることを意味します。したがって、「3」の約数は N を割ると言えます。同様に、 N のすべての約数 d について、d の約数は N の約数でもあると言えます。したがって、N の約数を計算すると、各約数 d のすべての約数が計算されます。N=6 の除数を計算しているときに、追加の計算なしで {1}、{2}、{3} の除数も取得 (および保存) する方法が必要です (それらはすべて 6 に対して既に計算されているため)。 .

実際の例として、N=20 の場合、関数が配列の配列を返すという意味で機能するようにしたいと考えています。ここで、外側の配列にはキーが 20 の除数として含まれます。つまり、キーは {20,10,5,4,2,1} になります。現在、これらのキーに関連付けられているのは配列です。これらの各配列は、それぞれのキーの除数です。ここで、すべての内部配列の要素の交点を取ると、20 の約数が得られます。つまり、20 の約数だけを計算しても、すべての要素が計算されます。しかし、必要な出力を取得したい余分な計算なしで。余分な計算とは、明らかに 20 の約数の約数を計算し、配列の配列を返すことができることを意味します。しかし、「20の約数の計算中に、20のすべての約数の約数自体が計算される」ことを知っているので、やりたくありません。

4

3 に答える 3

3

あなたが何を望んでいるのかわかりませんが、この簡単なスクリプトがあなたを助けることができると思います..それで十分かどうか教えてください

試す

function arrayOfDivisors($x) {
    $divisors = array ();
    for($i = 1; $i < $x; $i ++) {
        if ($x % $i == 0) {
            $divisors [] = $i;
        }
    }
    return $divisors;
}

$divisors = arrayOfDivisors ( 20 );
var_dump ( $divisors ); // List Divisors
var_dump ( array_sum ( $divisors ) )  // Total

出力

array
  0 => int 1
  1 => int 2
  2 => int 4
  3 => int 5
  4 => int 10


int 22   // Total 
于 2012-04-09T10:01:03.233 に答える
1

数値の約数をリストするアルゴリズムは次のとおりです。

y = x + 1 リム -> n

z = (ny)%((n+y)%n)

z = 0 の場合、y は n の除数です。

頑張って;D

于 2013-03-25T02:58:17.203 に答える
0

必要な出力への簡単なアプローチは、最初に元の数値の素因数分解を計算し、次にこれを使用してすべての除数 (およびその除数すべて) を列挙することです。

これが他のアプローチよりも手間がかからないことを確認する 1 つの方法は、必要な出力からこれを導き出すのは簡単であることに注意することです (たとえば、正確に 2 つの因数があるため、素因数を知っていて、次のことを確認できます)。より高い累乗が約数であるかどうか)。

于 2013-03-25T03:28:57.373 に答える