StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 26; i++) { sb.AppendLine( (char)('A' + i - 1) + "" + "," + i); } for (int i = 1; i <= 26; i++) { for (int j = 1; j <= 26; j++) { sb.AppendLine( (char)('A' + i - 1) + "" + (char)('A' + j - 1) + "" + "," + (i * 26 + j)); } } for (int i = 1; i <= 26; i++) { for (int j = 1; j <= 26; j++) { for (int k = 1; k <= 26; k++) { sb.AppendLine( (char)('A' + i - 1) + "" + (char)('A' + j - 1) + "" + (char)('A' + k - 1) + "" + "," + (i * 26 * 26 + j * 26 + k)); } } }
A__が1で、B__が2、C__が3と続き、Z__が26で、AA_が27、AB_が28、BA_が53、ZZ_が702、AAAが703、ZZZが18278まで。
約1万8千個を扱える。
中国のASATの試験では、「観測可能なものだけで2,841個以上」(wikipedia)ということなので、かなり余裕ありそう。とはいえ、2桁だと700個ほどしか扱えないから、やはり3桁は必要なんだろうな。
文字3桁分を整数で書こうとすると5桁必要だから、TLEに押し込むには文字を使うしかなかったんだろうなぁ。26進数恐るべし。
1958年頃から使われ始めたらしいが、当時の人はどうして700個じゃ足りないと思ったんだろうか。IPv4しかり、大抵は後から桁数が足りなくなるもんだけど。米軍のASATが59年だそうだから、当時からデブリとかは色々考えられてたんだろうか。
Cでコレを計算する場合、初期値をpiece = 0として、piece *= 26; piece += ch - 'A' + 1;を必要桁数分回せば文字列からintに戻せそう。
Cでコレを計算する場合、初期値をpiece = 0として、piece *= 26; piece += ch - 'A' + 1;を必要桁数分回せば文字列からintに戻せそう。
0 件のコメント:
コメントを投稿