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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

2769閲覧

Javaで素数か判定するプログラム

yoppi07

総合スコア30

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2017/08/04 06:03

編集2017/08/04 11:15

###前提・実現したいこと
Javaのソースコードにおいて、入力された値が素数かどうか判別されるロジックを理解したいです。
for文の中で初期値のiが2であるのにもかかわらず、1を入力すると1は素数です。
初期値を0にして実行し、数値を入力するとエラーになります。
このソースコードのロジックを理解したいので、簡単に教えて下さい。

###発生している問題・エラーメッセージ

Exception in thread "main" java.lang.ArithmeticException: / by zero

###該当のソースコード

public static void main(String[] args) { System.out.println("数値を入力して下さい"); Scanner num = new Scanner(System.in); int x = num.nextInt(); for (int i = 2; i < x; i++) { if (x % i == 0) { System.out.println(x + "は素数ではありません"); return; } } System.out.println(x + "は素数です"); } }

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

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

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

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

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

guest

回答3

0

ベストアンサー

素数の定義は「1と自分自身以外に約数を持たない、1以外の正整数」です。

1が入力されたら、無条件に「素数ではありません」と出力すべきですが、質問のコードには、入力された値(変数x)が1であるかどうか判断する部分がありません。そのため、「1は素数です」と出力されるのです。ここが、質問のコードの問題点です。

問題を解決するために、入力された値が1かどうかと正整数かどうかを判断する部分を付け加えると、コードは以下のようになります。

public static void main(String[] args) { System.out.println("数値を入力して下さい"); Scanner num = new Scanner(System.in); int x = num.nextInt(); if (x == 1) { // 1 が入力された時 System.out.println(x + "は素数ではありません"); return; } elseif (x <= 0) { // 0や負の数が入力された時 System.out.println(x + "は正の整数ではないので、素数ではありません"); return; } for (int i = 2; i < x; i++) { if (x % i == 0) { System.out.println(x + "は素数ではありません"); return; } System.out.println(x + "は素数です"); }

このコードであれば、正しく動作するはずですし、動作を追っていくのも難しくないと思います。

P.S.
コードは、インデント(ブロックごとの段下げ)すると読み易くなって、動作の理解も容易になります。
この回答のコードのほうが、読みやすくないですか?

投稿2017/08/04 06:35

coco_bauer

総合スコア6915

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

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

yoppi07

2017/08/04 07:26

ご回答および読みやすいソースコードありがとうございます。 そうですね。最初に1、0、0以下の条件で分岐させた方が理解しやすいですね。
guest

0

お疲れさまです。
素数とは、1 より大きい自然数で、正の約数が 1 と自分自身のみであるもののことである。(Wikipedia等から引用)
もっと簡単にいうと「1より大きい整数で、1とその数以外で割り切れない数」のことです。

このプログラムには不備があって、入力時に「1以上の自然数」を入力するよう誘導する必要、あるいはこれ以外の値が入力された時、はじく必要があります。

あとは入力された値を2から順番に(入力された値-1)まで順番に割っています。どこかの数字で割り切れた場合(あまり0の場合)は素数でないと判定し、割り切れなかった場合は素数と判定しています。

投稿2017/08/04 06:26

senior_golfer

総合スコア264

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

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

yoppi07

2017/08/04 06:46

ご回答ありがとうございます。 入力された値-1とはどういったことでしょうか?
senior_golfer

2017/08/04 07:03

「入力された値」を「入力された値以下=入力された値-1」までの数値で割ってみるということです。 入力された値まで回すと、割り切れてどんな数値も「素数ではありません」と返ってしまいます。 ちなみに i < xまで回さなくても、i < x/2まで回せは良いですし、もっと高速に判定する方法もいろいろなサイトに出ています。
yoppi07

2017/08/04 07:23

ありがとうございます。 色々と探ってみます。
maiko0318

2017/08/04 08:35

i < xまで回さなくても、i <√xまで回せは良いです。
LouiS0616

2017/08/04 09:05

i <= √x ですね。 4や9などの平方数の判定が出来ません。
guest

0

入力値が1の場合、最初にfor文に入る際の継続条件が2<1でfalseになるため、forに入らず次の素数である出力をしてしまいます。
初期値が0は、forで0除算をしてしまうためです。

投稿2017/08/04 06:18

swordone

総合スコア20651

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

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

yoppi07

2017/08/04 06:29

ご回答ありがとうございます。 for文のみ見ると初期値が2なので、 xに1を入力した場合、条件式で2<1になるので、 エラーになるという認識だったのですが、 i++でインクリメントされて正常に実行されるという認識で正しいでしょうか?
maisumakun

2017/08/04 06:31

エラーにはならず、「ループを一度も実行しない」ということになるだけです。
swordone

2017/08/04 06:38

条件式でエラーが出るならfor文なんてエラーだらけで使えません。きちんと文の意味を勉強してください。
yoppi07

2017/08/04 07:21

forの条件に合致しないので、for文は実行されずにif文で条件判断されて結果が出力されるということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問