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

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

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

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

Q&A

解決済

3回答

2131閲覧

ある整数が、2の倍数の時と3の倍数の時とそれ以外の時の出力

Bafetto

総合スコア22

Java

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

0グッド

0クリップ

投稿2022/05/27 03:08

編集2022/05/27 22:56

1~13の数字が書かれたトランプカードがあります。
カードの数字が2の倍数の時は「Doubt」と出力し、3の倍数の時は「Doubt!!」と出力し2と3の倍数の時は「Doubt Doubt!!」と出力する。それら以外の時は1~13の数字を出力する。
・入力値
13 2
2 Doubt
3 Doubt!!

・出力値
正しい
1
Doubt
Doubt!!
Doubt
5
Doubt Doubt!!
7
Doubt
Doubt!!
Doubt
11
Doubt Doubt!!
13

私の出力値
1
Doubt 2
Doubt!!
Doubt 4
5
Doubt Doubt!!
7
Doubt 8
Doubt!!
Doubt 10
11
Doubt Doubt!!
13

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 7 int n = sc.nextInt();//カードの枚数 8 int m = sc.nextInt();//掛け声の回数 9 10 int[] shoutRule = new int[m];//掛け声の規則を表す整数 11 String[] shout = new String[m];//掛け声 12 13 for(int i=0; i<m; i++){ 14 shoutRule[i] = sc.nextInt(); 15 shout[i] = sc.next(); 16 } 17 18 for(int i=1; i<=n; i++){ 19 int count = 0; 20 for(int j=0; j<m; j++){ 21 if(i % shoutRule[j] == 0){//倍数の時  22 count++; 23 if(count <= m){ 24 System.out.print(shout[j]); 25 if(count < m){ 26 System.out.print(" "); 27 }else{ 28 System.out.println(); 29 } 30 } 31 }else{//倍数でない時 32 count++; 33 if(count == m){ 34 System.out.println(i); 35 } 36 } 37 } 38 } 39 } 40} 41

整数が2の倍数で3の倍数でない時に間違っている。そこを修正すると、2の倍数で2の倍数の時がおかしくなってしまいます。自分では条件式の書き方が悪いと思うのですが、どう書いたら良いのかわかりません。

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

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

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

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

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

dodox86

2022/05/27 03:46

それほど重要ではないことですが質問件名について、 > ある整数が、偶数の時と奇数の時とそれ以外の時の出力 3は奇数ですが、それの偶数倍は偶数なので、そのまま「ある整数が、2の倍数の時と3の倍数の時とそれ以外の時の出力」で良いのではないでしょうか。問題の内容的にはよくあるFizzBuzzですね。
BeatStar

2022/05/27 04:18

多分、問題の意図を根本から取り間違えている。 二の倍数とは何でしょうか? 三の倍数とは何でしょうか? 具体的にさんの倍数を挙げていってください。算数が分かっていれば恐らく勘違いされていることがわかるはずです。
episteme

2022/05/27 04:56

> 偶数の時と奇数の時とそれ以外の時 それ以外? 偶数でも奇数でもないってなんやねん?
dodox86

2022/05/27 05:15 編集

@BeatStarさん > 多分、問題の意図を根本から取り間違えている。 そこまでじゃないんじゃないでしょうか。質問本文中では2の倍数、3の倍数、とのように書かれていますし、提示のコードもそれを反映していそうです。私の指摘も質問件名に関することです。ただ、まぁ、2つの倍数、ここでは2と3が入力値で可変で指定できるようになっているところを見ると、必ずしも2の倍数、3の倍数とは限らないんじゃないかな、と言う感はあります。
Bafetto

2022/05/27 10:30

回答ありがとうございます。「ある整数が、2の倍数の時と3の倍数の時とそれ以外の時の出力」が正しいですよね。変更できそうにないので、このままにします。 >必ずしも2の倍数、3の倍数とは限らないんじゃないかな、と言う感はあります。 その通りです。ここの数字は変化します。 >それ以外? 偶数でも奇数でもないってなんやねん? ここで言いたかった事は、Doubtの時・Doubt!!の時・1から13の数字の時でした。
BeatStar

2022/05/27 10:48

> 変更できそうにないので、このままにします。 質問本文のことですか? それなら編集が可能ですよ。 ケータイからでもできますし、PCからでもできます。 このteratailは質問者が問題解決するための場所ですが、ナレッジサービスとしての側面もあるので質問は編集してください。そもそも質問 = 前提となり、その前提が間違っているのならいくら丁寧な回答でも意味を成しません。「1 + 1 は何になるか?」という問いに対して「10の2乗は100です」と答えるようなものです。そもそも答えが合っていないので間違いとなる。 さらにナレッジサービスなので、似たようなケースでこのページに当たったとして納得できますか? 前提が間違っていれば意味を成しません。 人間関係ですらこれなのだから、機械を相手にするプログラミングなんて到底できるはずがありません。機械に人間の機微なんてわかりませんから。
dodox86

2022/05/27 10:52

質問者 Bafettoさん 本欄は「質問への追記・修正の依頼」欄なので、ご質問内容への指摘に留まります。 (まぁ確かに、本欄でほとんど回答、解答のようなことが投稿されることはありますが) > 自分では条件式の書き方が悪いと思うのですが、どう書いたら良いのかわかりません。 違っていたら申し訳無く、反論していただいて欲しいのですが、条件式の書き方(≒コードの書き方)と言うより前に考え方が頭の中でまだまとまっていないのではないかな、と言うかんじがします。もしそうである場合、条件式の書き方を回答でいただいても次はやっぱり自力で解決できない可能性があるかな、と。頭の中の設計をコードで具現化するに過ぎないので、頭の中でできないことは決してコードには落とせません。
Bafetto

2022/05/27 23:06

dodox86へ うーん。正直、自分でもよくわかりません。「考え方が頭の中でまだまとまっていない」このように指摘されると「そうなのかも」と思います。頭の中の設計というのは、どうゆうものなのでしょうか?まずこれやって、次にこれやって、最後にこれやってみたいな事でしょうか?何かフレームワークみたいな物があるのでしょうか?設計って入門書とかに書かれていたりしますか?
Bafetto

2022/05/27 23:08

BeatStarさんへ タイトル変更できました。編集ボタンがあるんですね。見落としていました。
Bafetto

2022/05/27 23:16

BeatStarさんへ 3の倍数は、3 6 9 12 15 18 21 24 27 と掛け算の3の段のことだと思っています。
BeatStar

2022/05/28 00:34

> 3の倍数は、3 6 9 12... Okです。 > タイトル変更できました。編集ボタンがあるんですね。見落としていました。 これもOkです。
dodox86

2022/05/28 01:51

> 頭の中の設計というのは、どうゆうものなのでしょうか?まずこれやって、次にこれやって、最後にこれやってみたいな事でしょうか? まぁ、そうです。言葉の捉え方、どれくらいの細かさで考えているかは人それぞれで違うと思いますが。 やりたいこと(what)の羅列も設計だし、どのように1行1行ごとに実行していくか(how)考えることも設計と呼びます。 ただ、プログラミングは1行1行ごとに具体的にイメージできないとコードを書けないはずですよね。 何となく書いていくと「どこをどう直したら良いでしょうか。」みたいな質問になりがちです。 > 何かフレームワークみたいな物があるのでしょうか? いいえ。特に無いです。 > 設計って入門書とかに書かれていたりしますか? いいえ。特に無いです。 回答ではないコメントばかりになりましたのでこの辺にしますが、既に回答を複数いただいていますので、対応しましょう。
guest

回答3

0

ベストアンサー

現在の質問文のコードは、「shoutRule最後の項目にマッチしなかったら数値を表示する」となってます。shoutRule が2項目あって、最初の項目にマッチして最後の項目にマッチしなかったら数値を表示しますね。

shoutRuleすべての項目にマッチしなかったら数値を表示する」というコードにしなければなりません。

投稿2022/05/27 03:27

int32_t

総合スコア20884

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

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

Bafetto

2022/05/29 06:12

>shoutRule のすべての項目にマッチしなかったら数値を表示する は、以下のコードで正しいでしょうか?他にもっと良い書き方がありますでしょうか? for(int i=1; i<=n; i++){ int count = 0;//マッチした回数 for(int j=0; j<m; j++){ if(i % shoutRule[j] == 0){ count++; System.out.println(shout[j]); } } if(count == 0){//マッチした回数が0なら System.out.println(i);//数値を表示 } }
int32_t

2022/05/29 14:34

それで大丈夫です。 countはbooleanでもいいです。
Bafetto

2022/05/30 03:14

int32_tさんへ 大変恐縮なのですが、今回の質問の模範解答を教えて頂けないでしょうか? いろいろヒントを頂いたのですが、どうしてもわかりません。 今回は写経をして終えたいのです。 良くない行為であることは理解していますが、ご検討宜しくお願い致します。
int32_t

2022/05/30 03:41

> 模範解答を教えて頂けないでしょうか? お断りします。 3つ前のコメントで質問者さんが書いたコードだと複数の掛け声が必要なときに空白が開かないんですかね。 そもそもshoutRuleのループ中では「このルールが最後のマッチかどうか」はわからないはずなので、shoutRuleのループ中で改行は出せません。 * count が 0 以外なら " " + shout[j]、そうでないなら shout[j] を改行なしで表示する * 何もマッチしなかった場合も改行なしで数値を表示する * iのループの最後で改行を表示する でどうでしょうか。
Bafetto

2022/06/05 07:47

>お断りします。 はい、そうですよね。 上記条件で書いてみました。すると for(int i=1; i<=n; i++){ int count = 0; for(int j=0; j<m; j++){ if(i % shoutRule[j] == 0){ count++; if(count != 0){ System.out.print(" " + shout[j]);//←① }else{ System.out.print(shout[j]);//←② } } } if(count == 0){ System.out.print(i); } System.out.println(); } 出力 1 Doubt Doubt!! Doubt 5 Doubt Doubt!! 7 Doubt Doubt!! Doubt 11 Doubt Doubt!! 13 文字出力の時、文字の前にスペースが入っていました。 ①と②を入れ変えると文字前のスペースが無くなるけど、文字間のスペースも無くなる。 >そもそもshoutRuleのループ中では「このルールが最後のマッチかどうか」はわからないはずなので、shoutRuleのループ中で改行は出せません。 →なるほど!!
Bafetto

2022/06/05 07:58

このような問題の時の規則性の見つけ方ってあるのでしょうか?
int32_t

2022/06/05 21:47

「count++; 」を「if(count != 0){」より後に移動するか、後者を「if(count != 1){」するか、ですね。 > このような問題の時の規則性の見つけ方 体系的な習得方法があるかどうかはわかりません。たくさんのコードを読んで書くぐらいしか思いつかないですね。
Bafetto

2022/06/07 11:29

回答ありがとうございます。 とりあえず、2通りのコードを書いてみました。ここまでヒントを貰って書けないとは情けないです。 int32_tさんは、2つ前のコードを見て、「「count++; 」を「if(count != 0){」より後に移動する」という結論にどのようなプロセスを経たのでしょうか? 例えば「iが2の時、shoutRule[j]が2でtrue。countが1になってDoubtを出力するためには、if(count != 0)の条件にすれば良い。みたいな感じなのでしょうか?それともパッと思いついたりするのでしょうか? >たくさんのコードを読んで書くぐらいしか思いつかないですね。 逆に言うとたくさんのコードを読んで書いていない状態では、考えても知識が足りないからコードは書けないということになるのでしょうか?もちろん頭の良い人は別として。
int32_t

2022/06/07 21:31

int count = 0; ... count++; if(count != 0){ ... } else { ... } この構成だと if のときに count は必ず1以上になっているので if の意味がなく、それを何とか直さないといけません。 「ここが問題である」ということを発見するには、デバッガか頭の中でコードをステップ実行します。
Bafetto

2022/06/09 10:46

回答ありがとうございました。また何かありましたら宜しくお願い致します。
guest

0

まずそもそもプログラミングっていのは「決まり切った文章を書くだけ」ではありません
ロジック(論理)を記述するのです。

まずは現実世界で今回の内容を考えてみてください。つまり算数かなんかの問題だと考えるのです。

そうすると、1〜100とかの範囲を一つづ見ていき、その数字が「2の倍数」「3の倍数」「そのいずれでもない」の3種類のどれに当てはまるかわかれば簡単なはずです。

では、「2の倍数」と言われた時、どのように考えますか? 私たち人間が(掛け算九九を知っていれば)九九から計算することができますね。でもこの九九(暗記)を使わずにやるとしたらどうでしょうか? 20 = 2 × 10 のような九九暗記程度でKさんできる代物であれば問題ないいですが228とかになるとどうでしょうか?
2の倍数は偶数でもあるので一の位が偶数かどうかで判断できますが、「253は7の倍数かどうか」は? 計算が苦手なタイプだと面倒に感じますよね。

そこで「2の倍数」の定義を調べましょう。
「3の倍数」でもいいです。とにかく、○の倍数とは何かを調べる。

定義的には、「2の倍数とは、2で割切れる数字」のはずです。
では、この「2で割り切れる」とはなんでしょうか?

ここで「規則性を見つけ」ましょう。

2の倍数とそれ以外(2の倍数ではない)をそれぞれ列挙しましょう。

2の倍数 = { 2, 4, 6, 8, 9, 10 … }
それ以外 = { 3, 5, 7, 9, 11 … }

※ 計算がちょっと面倒なのであえて1は対象外としています。

で、上記の2種類の規則性を見つけます。
2の倍数を見ると「常に2で割った時の余りが0になる」のですが、それ以外の数字は「2で割った時の余りが0以外」となっていますね。

これはもしかしたら2の倍数だけこうなっている可能性もありますね。なので3の倍数も同じように行う。
今回は対象外ですが5の倍数とかも同じようにやってみましょう。

すると、「Mの倍数とはMで割った時の余りが0になる」ことがわかりますね。(ちなみにMはNの値とは別のもので、2の倍数なら2とかを指しています)
では、余りとはなんでしょうか。…と深掘りして定義付けをしていくと、なんとなく見えて来ませんか?

それに「(2の倍数でもなく3の倍数でもなく)それ以外の数字」は、2で割り切れず(= 2の倍数の条件を満たせなかった)、3でも割り切れない(同じく)数字ってことになりますよね。

ということは、

2の倍数かどうか調べる
→(2の倍数でないなら)3の倍数かどうか調べる
→(3の倍数でもないなら)それ以外

とみなせるはずです。

あとはこれを実装すればいいのです。

対象範囲をループしてのチェックはできていますから、あとは条件式を立てて分岐させるだけです。
「Nで割り切れるか」のやつは「Nで割った時の余りが0かどうか」でわかります。
余りを計算するための演算子があるはずなのでそれを用いて調べる。「Java 余り 演算子」とかで調べれば出てくるはずです。

投稿2022/05/28 01:00

編集2022/05/28 07:17
BeatStar

総合スコア4958

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

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

dodox86

2022/05/28 06:49

> 「Nで割り切れるか」のやつは「Nで割った時の余りが0かどうか」でわかります。 > 余りを計算するための演算子があるはずなのでそれを用いて調べる。 えっと、提示コード中に以下があるので、入力値に応じてやっているのではないでしょうか。 > if(i % shoutRule[j] == 0){//倍数の時
BeatStar

2022/05/28 07:14

(あ、本当だ…) すみません、修正します。
guest

0

if(2の倍数?){ if(3の倍数){ // 1
}else{ // 2
}}else if(3の倍数?){ // 3
}else{ //4
}

この、//1から //4はどの状態のときに実行されるのか、を考えてみよう

投稿2022/05/27 03:20

y_waiwai

総合スコア87774

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

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

Bafetto

2022/05/27 11:08

回答ありがとうございます。 if(2の倍数?){ if(3の倍数){ // 1 2の倍数で同時に3の倍数の時実行       }else{ // 2        2の倍数の時実行      } }else if(3の倍数?){ // 3      3の倍数の時実行     }else{ //4 上記以外1~13を実行     } だと思います。
jimbe

2022/05/27 11:44

問題はソコでは無く、 j のループの中に数値の表示がある所為ではないでしょうか。
Bafetto

2022/05/29 03:13

jimbeさんへ jループの中に数値の表示を入れないコードと言うのは下記のような感じでしょうか? for(int i=0; i<m; i++){ shoutRule[i] = sc.nextInt(); shout[i] = sc.next(); } for(int i=1; i<=n; i++){ int count = 0; for(int j=0; j<m; j++){ if(i % shoutRule[j] == 0){//倍数の時 count++; System.out.println(shout[j]); } } if(count == 0){ System.out.println(i); } } 出力 1 Doubt Doubt!! Doubt 5 Doubt Doubt!! 7 Doubt Doubt!! Doubt 11 Doubt Doubt!! 13
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問