2014年11月25日

C#で「アルファベットの繰り上がり問題」を解く

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

■問題 (出題者 : にしお さん)
Excelの桁表示は 1桁目はA、2桁目はB、以下C、D、 E…とすすみ、Zの次はAA AB AC…と続きます。AZの次はBAです。
この表記法で1から100までを表示してください。出力結果は下記のサンプルの「...」の部分に適切な文字列を埋めたものになります。

A, B, C, ... CU, CV

アルファベットの文字列を基に次の文字列は何かをもとめるというやり方(例えば、AZの次は、一桁目がZだから、一桁目をAにして二桁目は繰り上げて、Aの次のBにする)ではなく、整数から対応する文字列に変換するメソッドを作って、それを、1から100まで繰り返すという方法を採りました。
そういう意味では「繰り上がり」という問題の趣旨からは外れているかもしれませんね。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            Do();
        }

        static void Do() {
            Console.Write(ToAlphabet(1));
            for (int i = 2; i <= 100; i++) {
                Console.Write(", " + ToAlphabet(i));
            }
            Console.WriteLine();
        }

        static string ToAlphabet(int n) {
            string r = "";
            int syo = (--n) / 26;
            if (syo > 0)
                r += (char)('A' + syo - 1);
            return r + (char)('A' + (n % 26));
        }
    }
}

ただし、上のコードは "ZZ"以上の数に対応できないという大きな制限があります。
そこで、書き直したのが次のToAlphabetメソッドです。
"ZZ" のつぎは、"AAA"となります。 これならば桁数に制限はありません。int の最大値まで扱えるはずです。
まあ、問題は 100までということなので、上のコードでも良いとは思います。

static string ToAlphabet(int n) {
    string r = "";
    do {
        int amari = (n-1) % 26;
        r = (char)('A' + amari) + r;
        n = (n-1) / 26;
    } while (n > 0);
    return r;
}



 

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

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