パラメータ(in)でたとえば、35421 という数字がきたとして、
その35421 を一ずつ取得したいです。
もし、数字が1と4の場合は×3をする。
もし、数字が2,3,5の場合は×9をする。
そして最終的には掛けた数字の一桁のみを表示させたいです。
35421 の場合、
39=27 //7のみ表示
59=45 //5のみ表示
43=12 //2のみ表示
29=18 //8のみ表示
1*3=3 //3のみ表示
最終的にはSystem.out.printlnで75283を表示させたい。
以下を実行したところSystem.out.println();何もコンソールに表示されませんでした。
どのようにコードを書いたらいいか教えていただきたいです。
java
1public String Num(String in){ 2 String out; 3 int total=0; 4 5for(int i=0;i< 10; i++){ 6 int value01=Integer.parseInt(in.substring(i,i+1)); 7 int value02=value01 % 10; 8 9 out += String.valueOf(value02); 10 11 switch(value02){ 12 case 1: 13 case 4: 14 total = value02 * 3; 15 break; 16 case 2: 17 case 3: 18 case 5: 19 total = value02 * 9; 20 break; 21 22 } 23 } 24 return out; 25}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/10 08:07
2020/09/10 09:51
回答6件
0
問題点をいくつか。
ループの中で一文字取り出して、整数にしよう、というのはよいのですが、
ループが10回固定では、10文字ちょうど以外の文字列が来た時におかしくなると思います。
また、1文字を数値に変換しているのですから、%10する処理は不要です。
そして、計算を行う前に、outに繋いでしまっているので、計算結果が結果に反映されません。
(JAVAでは文字列に変換せずとも、Stringとintの+演算は自動的にStringの連結して処理されます)
計算結果を1桁だけにする処理も必要です。
投稿2020/09/10 07:43
編集2020/09/10 07:46総合スコア1218
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/10 14:04
0
文字列で来るのなら、1文字づつとってきてintに変換すればいいです
提示のコードではvalueとvalue02が意味不明ですが。
また、コンソールに出力するコードも見当たりませんねー
投稿2020/09/10 07:21
編集2020/09/10 07:23総合スコア88051
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/10 07:51
退会済みユーザー
2020/09/10 12:12
退会済みユーザー
2020/09/10 12:14
2020/09/10 12:17
退会済みユーザー
2020/09/11 00:37
0
次のコードを研究してみてください。
java
1import java.util.HashMap; 2import java.util.Map; 3 4public class Main { 5 6 private static Map<Character, Character> map = new HashMap<Character, Character>() { 7 { 8 put('0', '0'); 9 put('1', '3'); // 1 * 3 -> 3 10 put('2', '8'); // 2 * 9 -> 18 - > 8 11 put('3', '7'); // 3 * 9 -> 27 - > 7 12 put('4', '2'); // 4 * 3 -> 12 -> 2 13 put('5', '0'); // 5 * 9 -> 45 -> 5 14 put('6', '6'); 15 put('7', '7'); 16 put('8', '8'); 17 put('9', '9'); 18 } 19 }; 20 21 private static int task(int num) { 22 String ans = ""; 23 String s = "" + num; 24 for (int i = 0; i < s.length(); i++) { 25 ans += map.get(s.charAt(i)); 26 } 27 28 return Integer.parseInt(ans); 29 } 30 31 public static void main(String[] args) { 32 int data[] = { 35421 }; 33 34 for (int num : data) { 35 int ret = task(num); 36 System.out.println(ret); 37 } 38 } 39}
投稿2020/09/10 23:36
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/21 13:02
0
以下を実行したところSystem.out.println();何もコンソールに表示されませんでした。
質問に書くコードは、実際にコンパイルして実行したコード全体にしてください。
質問への追記・修正依頼にも応えてください。
次のコードはどうでしょうか?
Java
1class Test { 2 public static String Num(String in) { 3 StringBuilder sb = new StringBuilder(); 4 String t = "0387256789"; 5 for (int i = 0; i < in.length(); i++) 6 sb.append(t.charAt(in.charAt(i) - '0') + " "); 7 return sb.toString(); 8 } 9 10 public static void main(String[] args) { 11 System.out.println(Num("35421")); 12 } 13}
実行結果
text
17 5 2 8 3
追記
最終的にはSystem.out.printlnで75283を表示させたい。
こう書いてあったので、数字の間にスペースが要るのかと思ったら、
全角数字で書いてあるからそう見えただけのようでした。
- で文字列を連結したり、StringBuilder を使うよりも char の配列を
使ったほうが効率が良いと思って書き直してみました。
Java
1class Test { 2 public static String Num(String in) { 3 int n = in.length(); 4 char[] out = new char[n]; 5 String t = "0387256789"; 6 for (int i = 0; i < n; i++) 7 out[i] = t.charAt(in.charAt(i) - '0'); 8 return String.valueOf(out); 9 } 10 11 public static void main(String[] args) { 12 System.out.println(Num("35421")); 13 } 14}
追記2
for文に、無意味な k = 0,
が入っていたのに気付きませんでしたか?
削除しました。
out[i] = '3'; は、単なる代入です。
sb.append('3'); は、StringBuilderクラスのインスタンス sb についての
appendメソッドの呼び出しです。sb や '3' を引数として渡す作業が入ります。
StringBuilder sb は内部にバッファを持っていて、今回の append でそれが
バッファオーバーフローしないかどうかチェックしてから '3' をバッファに入れます。
その後、this すなわち sb を返すという作業も必要です。
StringBuilder を使うほうが効率が悪いのは明白です。
String t = "0387256789"; ですが、"0123456789" と比べてみてください。
'1' → '3'
'2' → '8'
'3' → '7'
'4' → '2'
'5' → '5'
という対応になっています。
入力文字列の i番目の文字 in.charAt(i) に対応する文字への変換表です。
投稿2020/09/10 11:26
編集2020/09/11 02:44総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/10 12:27
退会済みユーザー
2020/09/10 13:15
2020/09/11 02:50 編集
退会済みユーザー
2020/09/11 02:58
0
ベストアンサー
こんな感じで。
問題点についてはamiyaさんが大体突っ込んでくれてますが、
forループが10固定なので例で出してる35421を入れるとArrayIndexOutOfBoundsExceptionになります。
またわざわざ一文字ずつ数字を取り出してるのに10で割るのは全く無意味です。
私はchar配列を作るやり方でやってみました。
java
1 public static void main(String[] args) { 2 System.out.print("入力してください> "); 3 Scanner sc = new Scanner(System.in); 4 String str = sc.nextLine(); 5 System.out.println(Num(str)); 6 } 7 8 public static String Num(String in){ 9 char[] out = new char[in.length()]; 10 11 for(int i=0;i< in.length(); i++){ 12 int value01=in.charAt(i) - '0'; 13 14 String total = ""; 15 switch(value01){ 16 case 1: 17 case 4: 18 total = String.valueOf(value01 * 3); 19 break; 20 case 2: 21 case 3: 22 case 5: 23 total = String.valueOf(value01 * 9); 24 break; 25 } 26 out[i] = total.charAt(total.length() - 1); 27 } 28 return new String(out); 29 }
投稿2020/09/10 07:53
編集2020/09/10 08:20総合スコア2183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/10 13:09
2020/09/10 13:31
退会済みユーザー
2020/09/10 14:05
0
java
1public class test { 2 3 public static String Num(String in) { 4 String out = ""; 5 int total = 0; 6 7 for (int i = 0; i < in.length(); i++) { 8 int value01 = Integer.parseInt(in.substring(i, i + 1)); 9 int value02 = value01 % 10; 10 11 switch (value02) { 12 case 1: 13 case 4: 14 total = value02 * 3; 15 break; 16 case 2: 17 case 3: 18 case 5: 19 total = value02 * 9; 20 break; 21 default: 22 total = value02; 23 } 24 25 String totalString = String.valueOf(total); 26 String lastKeta = totalString.substring(totalString.length() - 1); 27 out += lastKeta; 28 } 29 30 return out; 31 // return new String (out, total); 32 } 33 34 public static void main(String[] args) { 35 String num = Num("35421"); 36 System.out.println(num); 37 38 } 39}
投稿2020/09/10 07:35
総合スコア2027
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/10 11:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。