2014年11月19日

C#で与えられた数字のケタ数を調べる

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その50

このシリーズも、とうとう50回めです。まだストックがあるので、もうしばらくは続けるつもりです。

■問題  (出題者 : susuさん)
与えられた数字のケタ数と、最大桁の位を求めてください。
数字が2469なら4桁で最大桁は1000の位です。
600なら3と100、1なら1と1です。

最初に思い浮かんだ方法で書いたコードは、文字列に変換して桁数を求めるもの。
2つの値を求めなくちゃいけないので、戻り値は、Tuple を使いました。
でも、Item1 とかItem2という無味感想な名前は、僕の好みじゃないなー。

using System;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            Resolve(9);
            Resolve(99);
            Resolve(100);
            Resolve(-4532);
            Resolve(98765);
            Console.ReadLine();
        }

        static void Resolve(long n) {
            dynamic ans = DigitNumber(n);
            Console.WriteLine("{0} の桁数は {1}桁です。最大桁は {2}の位です", n, ans.Item1, ans.Item2);
        }

        static Tuple<int, long> DigitNumber(long n) {
            int fig = Math.Abs(n).ToString().Length;
            long place = (int)Math.Pow(10, fig - 1);
            return Tuple.Create(fig, place);
        }
    }
}

でも、数学の問題なのに、文字列使うのはやだなーと思い、 次に書いたのが、文字列にせずに、桁数を求めたもの。
1を10倍ずつしていって、もとの数の絶対値より大きくなるまで繰り返せば、 桁数が分かります。

static Tuple<int, long> DigitNumber(long n) {
    long absn = Math.Abs(n);
    int fig = 0;
    long place;
    for (place = 1; place <= absn; place *= 10)
        fig++;
    return Tuple.Create(fig, place);
}

だったら、log10でも見つかるよね、ということで書いたのが次のメソッド。

static Tuple<int, long> DigitNumber(long n) {
    int fig = (int)Math.Log10(Math.Abs(n)) + 1;
    long place = (long)Math.Pow(10, fig - 1);
    return Tuple.Create(fig, place);
}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52384998