数値 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のすべての約数の約数自体が計算される」ことを知っているので、やりたくありません。