トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

Cマガ電脳クラブ(第081回) いちいち調べる?

問題

ここに、3項からなる数列がある。
 1、10、100
これは、公比10の等比数列である。この3項の和をとってみると、111になっていることがわかる。

ではここで問題。
上の例のような、「和が111になる、等比数列の連続した3項」はいくつあるだろうか。
なお、各項の数値は整数に限る。


ソース

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int AnswerCnt = 0;

        for (int LoopSyokou = 1; LoopSyokou <= 148; LoopSyokou++) {
            List<BunsuuDef> RList = Solve2JiHouteishiki(LoopSyokou, LoopSyokou, LoopSyokou - 111);

            foreach (BunsuuDef EachR in RList) {
                int Kou2Bunsi = LoopSyokou * EachR.Bunsi;
                //分母を払えなかったら、整数でない
                if (Kou2Bunsi % EachR.Bunbo != 0) continue;
                int Kou2 = Kou2Bunsi / EachR.Bunbo;

                int Kou3Bunsi = Kou2 * EachR.Bunsi;
                //分母を払えなかったら、整数でない
                if (Kou3Bunsi % EachR.Bunbo != 0) continue;
                int Kou3 = Kou3Bunsi / EachR.Bunbo;

                AnswerCnt++;
                Console.WriteLine("解{0,2}を発見。等比数列は{1,3},{2,4},{3,3}",
                    AnswerCnt, LoopSyokou, Kou2, Kou3);
            }
        }
    }

    struct BunsuuDef
    {
        internal int Bunsi;
        internal int Bunbo;
    }

    //2次方程式の解を返す
    static List<BunsuuDef> Solve2JiHouteishiki(int pA, int pB, int pC)
    {
        var WillReturn = new List<BunsuuDef>();
        int IntHanbetuShiki = pB * pB - 4 * pA * pC;

        //平方数でない場合
        double DoubleHanbetuShiki = (double)IntHanbetuShiki;
        int wkSqrt = (int)(Math.Truncate(Math.Sqrt(DoubleHanbetuShiki)));
        if (wkSqrt * wkSqrt != IntHanbetuShiki) return WillReturn;

        WillReturn.Add(new BunsuuDef() { Bunsi = -pB + wkSqrt, Bunbo = 2 * pA });
        WillReturn.Add(new BunsuuDef() { Bunsi = -pB - wkSqrt, Bunbo = 2 * pA });

        //重解の場合
        if (IntHanbetuShiki == 0) WillReturn.RemoveAt(1);

        return WillReturn;
    }
}


実行結果

解 1を発見。等比数列は  1,  10,100
解 2を発見。等比数列は  1, -11,121
解 3を発見。等比数列は 27,  36, 48
解 4を発見。等比数列は 27, -63,147
解 5を発見。等比数列は 37,  37, 37
解 6を発見。等比数列は 37, -74,148
解 7を発見。等比数列は 48,  36, 27
解 8を発見。等比数列は 48, -84,147
解 9を発見。等比数列は100,  10,  1
解10を発見。等比数列は100,-110,121
解11を発見。等比数列は111,   0,  0
解12を発見。等比数列は111,-111,111
解13を発見。等比数列は121, -11,  1
解14を発見。等比数列は121,-110,100
解15を発見。等比数列は147, -63, 27
解16を発見。等比数列は147, -84, 48
解17を発見。等比数列は148, -74, 37


解説

初項をA、公比をXとすると
A +A*X + AX*X = 111 が成り立つので、変形して
A +A*X + AX*X -111 = 0
AX*X + A*X + A -111 = 0

Xが実数解を持つ条件は、判別式 b*b-4*a*cを使って
A*A-4*A*(A-111) >= 0
題意よりAは0でないので、両辺をAで割って
A-4*(A-111) >= 0
A-4*A+444 >= 0
-3*A >= -444
A <= 148

よって
A <= 148を、題意を満たすAの必要条件1とします。

また、
A +A*X + AX*X = 111 を、Aについて因数分解すると
A*(1+X+X*X) = 111
A*(X*X+X+1) = 111
Aが0だと、右辺が111にならないと分かります。
Aが負だと右辺が111になるための必要条件として、
X*X+X+1 < 0
を満たす必要がありますが、
X*X+X+1 を平方完成すると
(X+1/2)の2乗 + 3/4 なので
X*X+X+1 < 0 は解なしと分かります。

よって
A > 0を、題意を満たすAの必要条件2とします。