LoginSignup
1
0

More than 3 years have passed since last update.

(小ネタ)今更言うほどでもない数値→アルファベットの簡単な変換方法(Java)

Last updated at Posted at 2020-06-21

TL;DR

数値をcharにキャストすることで、簡単にアルファベットに変換できる

実践

具体的なコード1

Main.java
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

Main.java
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 様から引用

ロジャーは、彼のもとに突如現れた 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,... と命名されます。
(以下省略)

Main.java
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問題が解けそうで解けなくて悔しかったので。
次回は頑張ります。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0