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

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

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

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

Q&A

解決済

2回答

477閲覧

条件分岐がうまくいっていない

d_96a

総合スコア15

Java

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

0グッド

0クリップ

投稿2019/12/23 06:53

編集2019/12/23 08:45

###実現したいこと
num[1,2,3] fizz[ab,cd]という2つのlistが存在する場合に、
numの最後の要素(m)を他の要素で割り切れる場合(3%1==0,3%2==0)に
要素番号に対応するfizzの要素(ab,cd)を出力
mが他の要素全てで割り切れない場合(3%1!=0&&3%2!=0)に
mが素数か判定し、素数でない場合はそのままmを出力、
素数である場合はprimeを出力するプログラムを作成しました。
今回の場合numの最後の要素が3でnum[0]の1で割り切れるため
「ab」と出力されるのが正解なのですが、
下記コードで試行したところ、「abprime」と出力されてしまいました。
おそらく条件分岐がうまくいっていないことが原因だと思うのですが、
何度確認(メモ帳で思考を整理etc)しても自分ではどこが誤っているのか分からないため
どこが今回のミスを起因しているいるのかお分かりの方は、ご教示いただけないでしょうか。
###入出力例

入力: num[1,2,3] fizz[ab,cd] 出力: ab 実際: abprime

java

1  boolean flag=false; 2 int m = num.get(num.size()-1); 3 for(int i=0;i<num.size()-1;i++) { 4 if(m%num.get(i)==0) { 5 Collections.sort(num); 6 System.out.print(fizz.get(i)); 7 flag=true; 8 }else if(flag==false&&m>2){ 9 for(i = 2; i < m-1; i++){ 10 if(m % i == 0) { 11 System.out.println(m); 12 }else{ 13 System.out.println("prime"); 14 }return; 15 } 16 }else if(flag==false&&m<=2){ 17 System.out.println(m); 18 return; 19 } 20 }

###処理メモ
mがnumの要素で割れる(m%num.get(i))
→割れた時のnumと同じ要素番号のfizzを出力(fizz.get(i))

mがnumで割れないかつmが2より大きい(m%num.get(i)!=0&&m>2)
→mが素数でなければm
→mが素数であればprime

それ以外
→mを出力

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

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

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

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

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

azuapricot

2019/12/23 06:57

インデントが悲惨なので直しましょう
TN8001

2019/12/23 07:50

同じ問題についての一連の質問だと思うのですが、スタート地点がずれているように思います。 mが素数かどうかは、numにある数字とは無関係に決まりますよね? numにある(1とm以外の)数字で割り切れるなら「素数でない」ことはわかりますが、「素数である」とは言えませんよね?(numに入っていない数字で割り切れるかもしれない) mが素数かどうかは(素朴な実装では)2からm-1まで順に割り切れれるかのループになるはずです(numでのループでは求まりません)
d_96a

2019/12/23 07:59

その素数の判定に先ほど気づきました! 過去の質問を追ってまでご丁寧にご回答ありがとうございます。
azuapricot

2019/12/23 08:09

『メモ帳で思考を整理』 その整理した内容を質問に追記したほうがいいかもしれませんね。 根本的に何かが違うかもしれませんし
d_96a

2019/12/23 08:12

なるほど、そちらも追記させていただきます。
guest

回答2

0

ベストアンサー

今回のケースですと、for(int i=0;i<num.size()-1;i++){...}{...}部分は2回繰り返すことになりますよね?
ということは、1回目は3÷1で割り切れるためif(m%num.get(i)==0){...}が実行されabが出力されるものの、そこでループが終了するわけではなく2周目のループに入ってしまうので、2周目では3÷2が割り切れずif(m%num.get(i)==0)else{...}の方の指示内容が実行されてしまっています。

ちなみに、System.out.println()は出力した後改行しますがSystem.out.print()は出力後の改行がないため、1周目でabを出力したあと改行せずに2周目でprimeと出力したため、abprimeという文字列が出力されてしまっています。

投稿2019/12/23 07:04

FoyLand

総合スコア72

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

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

d_96a

2019/12/23 07:19 編集

確かにご指摘にあったように現状だと 想定である 「要素のどれかでmが割り切れる場合はprimeやmを出力せず、  対応したfizzの要素が出力される」 のではなく、 「要素のどれかで割り切れた場合でもprimeやmを出力される」 ようになっていますね。 今回の場合は、for,if文を別々にすることで解決する感じでしょうか。
FoyLand

2019/12/23 07:30

そうですね。 まず初めに「mを割り切れる要素番号」を取得して、「mを割り切れる要素番号があるかないか」で場合分けを行いましょう。 ない場合はmまたはprimeを出力する指示を与え、 ある場合は「mを割り切れる要素番号」に対応したfizzの要素を出力する指示を与えましょう。
d_96a

2019/12/23 08:02

ご指摘内容を踏まえてコードの前にflagを立てることでこの問題自体は解決したのですが、 num[1,2,6] fizz[ab,cd]の場合[abcd]と出力されるはずですが、[ab]で止まってしまっています。 この場合はどのような対応をしたらよいのでしょうか。 boolean flag=false; int m = num.get(num.size()-1); for(int i=0;i<num.size()-1;i++) { if(m%num.get(i)==0) { System.out.print(fizz.get(i)); flag=true; }else if(flag==false&&m>2) { for(i = 2; i < m-1; i++) { if(m % i == 0) { System.out.println(m); }else { System.out.println("prime"); }return ; } }else if(flag==false&&m<=2){ System.out.println(m); }return; }
d_96a

2019/12/23 08:21

こちらreturnの位置を変更することで解決いたしました。 長い間丁寧にご対応いただきありがとうございます!
guest

0

java

1import java.util.*; 2 3 4class ConversionRule { 5 int num; 6 String label; 7 ConversionRule(int num, String label){ 8 this.num = num; 9 this.label = label; 10 } 11 12 int getNumber(){ 13 return this.num; 14 } 15 16 String getLabel(){ 17 return this.label; 18 } 19 20 Optional<String> convert(int target){ 21 if(target % this.num == 0){ 22 return Optional.of(this.label); 23 } 24 return Optional.empty(); 25 } 26} 27 28public class Main { 29 30 static boolean isPrime(int m){ 31 if(m < 2){ 32 return false; 33 } 34 35 for(int i = 2; i < m; i++) { // ※sqrt(m)でいい 36 if(m % i == 0) { 37 return false; 38 } 39 } 40 return true; 41 } 42 43 public static void main(String[] args) throws Exception { 44 45 List<ConversionRule> rules = new ArrayList<>(Arrays.asList(new ConversionRule(1,"ab"), new ConversionRule(2,"cd") )); 46 int target = 6; 47 48 49 List<String> result = new ArrayList<>(); 50 51 for(int i = 0; i < rules.size(); i++) { 52 ConversionRule rule = rules.get(i); 53 rule.convert(target).ifPresent((label) -> result.add(label)); 54 // if(target % rule.getNumber() == 0){ 55 // result.add(rule.getLabel()); 56 // } 57 } 58 59 if(result.size() == 0){ 60 if(isPrime(target)){ 61 result.add("prime"); 62 }else{ 63 result.add(String.valueOf(target)); 64 } 65 } 66 67 for(int i = 0; i < result.size(); i++) { 68 System.out.println(result.get(i)); 69 } 70 71 } 72} 73 74

投稿2019/12/23 08:23

ozwk

総合スコア13521

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

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

d_96a

2019/12/23 08:43

コード丸ごと記述いただきありがとうございます。 上記のコードはScanner入力、数値の昇順による並び替えにも対応できるのでしょうか。
ozwk

2019/12/23 09:09

はい
d_96a

2019/12/23 09:13

num[2,1,4]→num[1,2,4] num[0]⇔num[1] fizz[ab,cd]→fizz[cd,ab] fizz[0]⇔fizz[1] 上記のような一方を並び替えるともう一方も並べ替えるにはどうしたらよいのでしょうか。
ozwk

2019/12/23 10:26 編集

そういうときに話が面倒になるから ConversionRule と値を意味ある構造にまとめています 大本の問題は 「数値と文字列のペア」と 「変換対象の数値」 が渡されるんですよね? そのまま書けばいいんです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問