ホームページ  >  記事  >  バックエンド開発  >  階乗 n を連続する数値の合計として表現します

階乗 n を連続する数値の合計として表現します

WBOY
WBOY転載
2023-09-07 14:29:021409ブラウズ

階乗 n を連続する数値の合計として表現します

数値の階乗を連続する数値の合計として表現する方法を見つけるための 2 つの方法について説明します。最初の方法は直接的で単純な方法ですが、もう 1 つの方法では等差数列の概念を使用して、占有される時間と空間の点で複雑さを軽減します。

###問題文###

数値が与えられた場合、その数値の階乗を連続する自然数の合計として表現する方法を見つける必要があります。

これには 2 つの異なる機能が関係します -

    数値の階乗を求めます。
  • 数値を連続する自然数の合計として表現できる方法の数を求めます。
  • 例 1
リーリー

誰もが知っているように、3 の階乗は 6 であり、1 2 3 と書くことができるため、答えは 1 通りです。

例 2

リーリー

誰もが知っているように、4 の階乗は 24 で、7 8 9 と書くことができるため、答えは 1 通りです。

方法1

これは単純な方法です。まず数値の階乗を求め、それを連続する自然数の和として表現できる方法の数を計算します。この方法は、階乗を一連の算術長さ len 1 として -

のように表現することです。 リーリー

len を正の整数として取得した場合、それを解として扱います。

###例###

次の例では、数値の階乗を連続する数値の合計として表現する方法の数を求めます。

リーリー ###出力###

上記の C プログラムを実行すると、次の出力が生成されます -

リーリー

方法 2: 最適化方法

これはより良いアプローチです。上記のアプローチではオーバーフローが発生します。

数値 p から始まる len 個の連続する数値の合計は、 -

と書くことができます。 リーリー

sum

も Number! に等しいためです。

###我々は書ける### リーリー

ここでは、すべての (len, p) ペアを数えるのではなく、すべての (len, (len 2*p 1)) ペアを数えます。これは、AB=2*Number であるすべての順序付けされた pf (A, B) を計算することを意味します。そしてA

これは、2*数値の奇数の約数を探していることを意味します。これは Number の奇数の約数でもあります。 約数の数を計算するには! 、因数分解では素数の累乗を計算する必要があり、約数の数は (f1 1)*(f2 1)* … *(fn 1) となります。

ルジャンドルの公式を使用して、数値の階乗における素数の最大累乗を計算します。

###例###

このアプローチのコードを以下に示します - リーリー ###出力###

上記の C プログラムを実行すると、次の出力が生成されます -

リーリー ###結論は###

この記事では、数値の階乗を連続する自然数の合計として表現する、数値を求める 2 つの異なる方法について説明しました。

以上が階乗 n を連続する数値の合計として表現しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。