トップページに戻る
次の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型の配列を作成して、
増加数,減少数,活発な数のどれかを判定してます。