TL;DR
数値をcharにキャストすることで、簡単にアルファベットに変換できる
実践
具体的なコード1
public class Main {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 26; i++) {
System.out.print((char) (97 + i) + " ");
}
}
}
具体的なコード2
public class Main {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 26; i++) {
// こんな書き方もできる **
System.out.print((char) ('a' + i) + " ");
}
}
}
出力結果
a b c d e f g h i j k l m n o p q r s t u v w x y z
応用
[ABC171C] (https://atcoder.jp/contests/abc171/tasks/abc171_c) 様から引用
ロジャーは、彼のもとに突如現れた 1000000000000001匹の犬をすべて飼うことを決意しました。
犬たちにはもともと 1から 1000000000000001までの番号がふられていましたが、ロジャーは彼らに以下のルールで名前を授けました。
1,2,⋯,26番の番号がついた犬はその順に a,b,...,z と命名されます。
27,28,29,⋯,701,702番の番号がついた犬はその順に aa,ab,ac,...,zy,zz と命名されます。
703,704,705,⋯,18277,18278番の番号がついた犬はその順に aaa,aab,aac,...,zzy,zzz と命名されます。
18279,18280,18281,⋯,475253,475254番の番号がついた犬はその順に aaaa,aaab,aaac,...,zzzy,zzzz と命名されます。
475255,475256,⋯番の番号がついた犬はその順に aaaaa,aaaab,... と命名されます。
(以下省略)
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong(); //例: 18277
StringBuilder ans = new StringBuilder();
// 26で割った余りをアルファベットに変換することで、後ろから文字列を決めていく
while (n != 0) {
// // ここは何故n--する必要があるのか理解しきれていないので、誰か親切な方教えていただけると助かります。。
// 2020/06/22 追記
// n % 26 = 1の時にa、... n % 26 = 25の時にzに変換されるようにしたいが、
// このままだとn % 26 = 1のときにbになってしまうため、n--する。
n--;
// loop1 18276
// loop2 701
// loop3 25
// 数値をcharにキャストすることでアルファベットに変換
ans.append((char) ('a' + n % 26));
// loop1 18276 % 26 = 24 => y
// loop2 701 % 26 = 25 => z
// loop3 25 % 26 = 25 => z
n /= 26;
// loop1 702
// loop2 26
// loop3 0 -> 終了
}
// 逆順に文字列を作っていたため、reverse();
ans = ans.reverse();
System.out.println(ans); // zzy
sc.close();
}
}
あとがき
C問題が解けそうで解けなくて悔しかったので。
次回は頑張ります。