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

Problem112 活発な数の割合が99%ちょうどになる最小の数

問題

左から右までどの桁もその左の桁を上回らない数を増加数と呼ぶ. 例えば, 134468.
同様に, どの桁もその右の桁を上回らない数を減少数と呼ぶ. 例えば, 66420.
増加数でも減少数でもない正の整数を「活発な」数と呼ぶことにする. 例えば, 155349.

100以下の数に活発な数が無いのは明らかだが, 1000より下の数では半数を少し上回る数(525)が活発である.
実際, 活発な数の割合が50%に達する最少の数は538である.

驚くべきことに, 活発な数はますます一般的になり, 21780では活発な数の割合は90%に達する.
活発な数の割合が99%ちょうどになる最小の数を求めよ.


ソース

using System;

class Program
{
    static void Main()
    {
        int KappatuNumCnt = 0;
        for (int I = 1; I < int.MaxValue; I++) {
            char[] wkArr = I.ToString().ToCharArray();
            bool IsZouka = true;
            bool IsGensyou = true;
            for (int J = 1; J <= wkArr.GetUpperBound(0); J++) {
                if (wkArr[J - 1] < wkArr[J]) IsGensyou = false; //増加した場合
                if (wkArr[J - 1] > wkArr[J]) IsZouka = false;   //減少した場合
            }
            if (IsZouka == false && IsGensyou == false) {
                KappatuNumCnt++;
                Console.WriteLine("{0}は活発な数", I);
            }
            double KappatuRate = (double)KappatuNumCnt / I;
            Console.WriteLine("{0}までの活発な数の割合は{1}", I, KappatuRate);
            if (KappatuRate == 0.99D) {
                Console.WriteLine("ちょうど99%になりました");
                return;
            }
        }
    }
}


実行結果

省略
1586998は活発な数
1586998までの活発な数の割合は0.98999998739759
1586999は活発な数
1586999までの活発な数の割合は0.989999993698799
1587000は活発な数
1587000までの活発な数の割合は0.99
ちょうど99%になりました


解説

int型に対して、ToString().ToCharArray()でchar型の配列を作成して、
増加数,減少数,活発な数のどれかを判定してます。