質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

8520閲覧

36進数から10進数へ変換したい

nababy

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/01/17 10:45

つい最近からJavaの勉強を始めました。
進数変換の関数を使わないで、36進数から10進数へ変換するプログラムを作りたいです。
言語はJavaです。

出力部分はもう少し綺麗にする予定です。
一文字ずつ変換することはできたのですが、最終的にはs1~s4(4文字)の36進数を変換させたいです。
このコードでは難しいでしょうか?

public class sinsu { public static void main(String[] args){ // 36進数の入力と結果 String s1 = "A"; System.out.print(s1+"は"); int res1 = number.HextoDec(s1); System.out.println("10進数では" + res1 + "です。"); String s2 = "B"; System.out.print(s2+"は"); int res2 = number.HextoDec(s2); System.out.println("10進数では" + res2 + "です。"); String s3 = "Y"; System.out.print(s3+"は"); int res3 = number.HextoDec(s3); System.out.println("10進数では" + res3 + "です。"); String s4 = "Z"; System.out.print(s4+"は"); int res4 = number.HextoDec(s4); System.out.println("10進数では" + res4 + "です。"); } } class number{ // 36進数を定義 public static final char[] num = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','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'}; // 36進数の1文字を10進数に変換するプライベートメソッド private static int toDec(char c){ int n; for( n = 0; num[n] != c; n++); return n; } // 36進数を10進数に変換するメソッド public static int HextoDec(String s){ int n = 0; for( int i = 0; i < s.length(); i++){ n = n * 36 + toDec(s.charAt(i));//けたをずらしながら10進数を計算 } return n; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

難しいも何も、今のHextoDexメソッドに4文字つなげたStringを渡せば実現できるかと思うのですが。
もっとも、変換メソッドはもっと簡略化の余地が有りますが。


コードをちょっと書いてみました
パターン1:使う文字を文字列として用意しておく

java

1class Number{ 2 public static final String num = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 3 4 private static int toDec(char c){ 5 int n = num.indeOf(c); 6 if(n >= 0) return n; 7 //その文字が36進数で使う文字でなかった場合に例外を発生させる 8 else throw new IndexOutOfBoundsException(String.valueOf(c)); 9 } 10 public static int HextoDec(String s){ 11 //ここはそのまま 12 } 13}

パターン2:文字コードで判別

java

1class Number{ 2 private static int toDec(char c){ 3 if(c >= '0' && c <= '9') return c - '0'; 4 if(c >= 'A' && c <= 'Z') return 10 + c - 'A'; 5 //小文字にも対応してみた 6 if(c >= 'a' && c <= 'z') return 10 + c - 'a'; 7 throw new IllegalArgumentException(String.valueOf(c)); 8 } 9 public static int HextoDec(String s){ 10 //ここはそのまま 11 } 12} 13

例外はRuntimeException系で適当に選定しました。

投稿2016/01/17 12:17

編集2016/01/17 15:41
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nababy

2016/01/17 13:32

そのまま4文字入力し、渡したら出来ました。 ありがとうございました。
guest

0

きれいでありませんが、それなりに動作するものを書いてみました。

java

1public class BaseNum { 2 public static void main(String[] args) { 3 char[] chars = { 4 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 5 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 6 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 7 'U', 'V', 'W', 'X', 'Y', 'Z', 8 ' ' 9 }; 10 for (char c : chars) { 11 try { 12 int num = charToNum(c, 36); 13 String str36 = numToStr(num, 36); 14 System.out.println("" + c + " -> " + charToNum(c, 36) + " -> " + str36); 15 } catch (Exception e) { 16 System.out.println(e); 17 } 18 } 19 20 String[] strs = { 21 "0", "0000", 22 "0001", "1234", "5678", "9999", 23 "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX", "YZ01","ZZZZ", 24 "ABCDEFGHIJKLMNOPQRSTUBWXYZ1234567890" 25 }; 26 for (String str : strs) { 27 try { 28 int num = strToNum(str, 36); 29 String str36 = numToStr(num, 36); 30 System.out.println(str + " -> " + num + " -> " + str36); 31 } catch (Exception e) { 32 System.out.println(e); 33 } 34 } 35 } 36 37 // 36進数を定義 38 private static final String NUMS = "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 39 40 // Base進数の1文字を10進数に変換する 41 public static final int charToNum(final char c, final int base) throws Exception { 42 int n = NUMS.indexOf(c); 43 if ((0 <= n) && (n < base)) { 44 return n; 45 } 46 throw new Exception("Bad char:[" + c + "]"); 47 } 48 49 // Base進数の文字を10進数に変換する 50 public static final int strToNum(final String str, final int base) throws Exception { 51 int n = 0; 52 // TODO: str の先頭が +や-始まる場合も扱えるようにする事 53 for (final char c : str.toCharArray()) { 54 n = n * base + charToNum(c, base); 55 if (n < 0) { 56 throw new Exception("Overflow: [" + str + "]"); 57 } 58 } 59 return n; 60 } 61 62 // 数字を Base進の文字列に変換する 63 public static final String numToStr(final int num, final int base) { 64 if (num == 0) { 65 return "0"; 66 } 67 68 String str = ""; 69 String sign = ""; 70 int work = num; 71 if (work < 0) { 72 sign = "-"; 73 work *= -1; 74 } 75 while (work > 0) { 76 int k = work % base; 77 str = NUMS.substring(k, k + 1) + str; 78 work = work / base; 79 } 80 return sign + str; 81 } 82}

実行例

0 -> 0 -> 0 1 -> 1 -> 1 2 -> 2 -> 2 3 -> 3 -> 3 4 -> 4 -> 4 5 -> 5 -> 5 6 -> 6 -> 6 7 -> 7 -> 7 8 -> 8 -> 8 9 -> 9 -> 9 A -> 10 -> A B -> 11 -> B C -> 12 -> C D -> 13 -> D E -> 14 -> E F -> 15 -> F G -> 16 -> G H -> 17 -> H I -> 18 -> I J -> 19 -> J K -> 20 -> K L -> 21 -> L M -> 22 -> M N -> 23 -> N O -> 24 -> O P -> 25 -> P Q -> 26 -> Q R -> 27 -> R S -> 28 -> S T -> 29 -> T U -> 30 -> U V -> 31 -> V W -> 32 -> W X -> 33 -> X Y -> 34 -> Y Z -> 35 -> Z java.lang.Exception: Bad char:[ ] 0 -> 0 -> 0 0000 -> 0 -> 0 0001 -> 1 -> 1 1234 -> 49360 -> 1234 5678 -> 241316 -> 5678 9999 -> 431901 -> 9999 ABCD -> 481261 -> ABCD EFGH -> 673217 -> EFGH IJKL -> 865173 -> IJKL MNOP -> 1057129 -> MNOP QRST -> 1249085 -> QRST UVWX -> 1441041 -> UVWX YZ01 -> 1631665 -> YZ01 ZZZZ -> 1679615 -> ZZZZ java.lang.Exception: Overflow: [ABCDEFGHIJKLMNOPQRSTUBWXYZ1234567890]

↑では 0 から Z を整数に変換できること、それを36進にすると元の文字に戻ること
幾つかの4文字の文字列が数字に変換できること、それを36進にすると元に戻ること
が確認できています。
不正な文字があるとエラーになること、あまり長い文字列を指定するとエラーになることも確認しています。

投稿2016/01/17 13:25

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のように標準APIで変換メソッドが用意されてるんですが、これではダメなんでしょうか。
2桁以上の36進数の変換も可能です。

36進数 > 10進数

Java

1Integer.parseInt("z",36)

10進数 > 36進数

Java

1Integer.toString(35, 36)

投稿2016/01/17 13:20

編集2016/01/17 13:28
JMA

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/01/17 13:33

「進数変換の関数を使わないで」と質問に書いてありますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問