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

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

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

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

Q&A

解決済

6回答

649閲覧

Javaで計算式を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2020/09/10 07:16

編集2020/09/10 07:27

パラメータ(in)でたとえば、35421 という数字がきたとして、
その35421 を一ずつ取得したいです。
もし、数字が1と4の場合は×3をする。
もし、数字が2,3,5の場合は×9をする。
そして最終的には掛けた数字の一桁のみを表示させたいです。

35421 の場合、
9=27  //7のみ表示
9=45  //5のみ表示
3=12  //2のみ表示
9=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ページで確認できます。

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

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

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

yureighost

2020/09/10 07:23

コンパイルエラーが出てます。 int value02=value % 10; のvalueが定義されていない(value01の間違い?) new String (out, total)がエラー(String型にString(String, int)の型のコンストラクタはありません) これはさすがに何やりたいかわからないので、ちゃんとコンパイルが通るソースを提示してください。
m.ts10806

2020/09/10 08:07

コード内にSystem.out.println()がありませんが
kazuma-s

2020/09/10 09:51

与えられた数の中に 0、6~9 があった場合どうするんですか?
guest

回答6

0

問題点をいくつか。
ループの中で一文字取り出して、整数にしよう、というのはよいのですが、
ループが10回固定では、10文字ちょうど以外の文字列が来た時におかしくなると思います。
また、1文字を数値に変換しているのですから、%10する処理は不要です。
そして、計算を行う前に、outに繋いでしまっているので、計算結果が結果に反映されません。
(JAVAでは文字列に変換せずとも、Stringとintの+演算は自動的にStringの連結して処理されます)
計算結果を1桁だけにする処理も必要です。

投稿2020/09/10 07:43

編集2020/09/10 07:46
amiya

総合スコア1218

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

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

退会済みユーザー

退会済みユーザー

2020/09/10 14:04

ありがとうございます!
guest

0

文字列で来るのなら、1文字づつとってきてintに変換すればいいです

提示のコードではvalueとvalue02が意味不明ですが。
また、コンソールに出力するコードも見当たりませんねー

投稿2020/09/10 07:21

編集2020/09/10 07:23
y_waiwai

総合スコア87800

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

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

y_waiwai

2020/09/10 07:51

しかし、回答後の質問の修正でマイナス食らうってのはどーにかできんもんかw
退会済みユーザー

退会済みユーザー

2020/09/10 12:12

え、すいません、気が付かないで押してしまってました。。わざとでないです!失礼いたしました。。m(__)m
退会済みユーザー

退会済みユーザー

2020/09/10 12:14

こんな機能があるなんて知りませんでした、、
y_waiwai

2020/09/10 12:17

いえいえ、teratailのシステム的な不都合もあったりしますんで、質問くんのせいとはいえないです。 #回答では質問の編集の通知が来ないってのがガンですわな
退会済みユーザー

退会済みユーザー

2020/09/11 00:37

教えていただけてほんとよかったです、、ずっと気づかなかったかもです。。(;'∀')
guest

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

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2020/09/21 13:02

コードありがとうございます!ホントいろいろな書き方があるのですね! private static Map<Character, Character> map = new HashMap<Character, Character>() →この書き方が初めて目にしました。。勉強になりました!ありがとうございます!
guest

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
kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2020/09/10 12:27

追記・修正依頼ですが、すいません、理解するのに時間がかかってしまい。。 StringBuilder を使うよりも char の配列を 使ったほうが効率が良いと思って書き直してみました。→yureighostさんのコードも見ていて、いろいろググってみたのですが、なぜ配列のほうが効率がいいのかわからないのですが、すいませんが教えていただけないでしょうか?
退会済みユーザー

退会済みユーザー

2020/09/10 13:15

ありがとうございます。 String t = "0387256789"; すいません。。こちらのコードがどういう意味を持つのかがわからないです。。
momon-ga

2020/09/11 02:50 編集

一桁同士の掛け算の答えの1桁目をつなげたものだと思います。 1,4は3倍、2,3,5は9倍、それ以外を1倍にしてと、0~9まで行って 0,3,18,27,12,45,6,7,8,9 の、下一桁をつなげたものが、 "0387256789";になっていて、計算でなく数字を機械的に置き換えるように定義しているみたいですね。
退会済みユーザー

退会済みユーザー

2020/09/11 02:58

1,4は3倍、2,3,5は9倍、それ以外を1倍にしてと、0~9まで行って→ なるほどですね!なんの数字かわかりませんでした。。 ありがとうございます!
guest

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
yureighost

総合スコア2183

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

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

退会済みユーザー

退会済みユーザー

2020/09/10 13:09

ご回答ありがとうございます。質問なんですが、String型ではなく、なぜ配列型にされたのでしょうか?
yureighost

2020/09/10 13:31

Stringから一文字取り出すcharAtと言うメソッドが返すのがchar型であること。 それとStringとchar配列は相互変換できるので。 javaでは文字列操作の方法の一つとしてよく使われます。
退会済みユーザー

退会済みユーザー

2020/09/10 14:05

なるほど!ありがとうございます!
guest

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

YakumoSaki

総合スコア2027

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

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

退会済みユーザー

退会済みユーザー

2020/09/10 11:15

ご回答ありがとうございます。 return out; // return new String (out, total); 結果をoutだけ返すのも、結果をoutとtotalの2つ返すのも結果が同じになったのですが、 これは1つ返すのと2つ返すのと違うのになぜ実行結果が同じになるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問