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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

5回答

1782閲覧

0から100までの素数を表示して、昇順に並び替えるプログラムを作成したのですが、なぜか0が出力されてしまいます

L4zy

総合スコア18

Java

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/04/12 03:03

0から100までの素数を表示して、昇順に並び替えるプログラムを作成したのですが、なぜか0が出力されてしまいます。なぜ0が出力されてしまうのかの原因が知りたいです。どなたか助けてください。

public class chart3
{
final static int MAX = 100;
public static int i = 0;
public static int j = 0;
public static int box = 0;
public static int sosuMax = 0;
public static int[] array = new int[100];

public static void main( String[] args ) { for(i = 0; i <= MAX; i++) { if(SosuCheck(i)) { array[j] = i; j = j + 1; } } sosuMax = j; //昇順 while(j > 0) { for(i = 0; i < j; i++) { if(array[i + 1] < array[i]) { box = array[i + 1]; array[i + 1] = array[i]; array[i] = box; } } j = j - 1; } //出力 for(i = 0; i <= sosuMax; i++) { System.out.print(array[i] + " "); } } public static boolean SosuCheck(int i) { if(i == 2) { return true; } //判定数値を偶数で割れた場合は奇数ではない if(i % 2 == 0 || i < 2) { return false; } for(int kisuu = 3; kisuu < Math.sqrt(i); kisuu += 2 ) { if(i % kisuu == 0 ) { return false; } } return true; }

}

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

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

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

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

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

y_waiwai

2020/04/12 03:05

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答5

0

0から100までの素数を求めたいのですが、2しか素数として出力されません

上が非表示になってしまいましたが、まだ解決していなかったようですので、私の方でコードを用意しておきました。

Java

1public class chart3 { 2 public static void main(String[] args) { 3 var max = 100; 4 var arr = java.util.stream.IntStream.rangeClosed(0, max).toArray(); 5 arr[1] = 0; 6 var maxSqrt = (int)Math.sqrt(max); 7 for (var i = 2; i <= maxSqrt; i++) { 8 if (arr[i] == 0) continue; 9 for (var j = i * i; j <= max; j += i) arr[j] = 0; 10 } 11 for (var p : arr) if (p != 0) System.out.print(p + " "); 12 System.out.println(); 13 } 14}

これを提出しておいてください。

投稿2020/04/12 05:57

raccy

総合スコア21739

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

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

0

質問文のコードをベースに修正してみました。
比較してみてください。

java

1public class Main { 2 final static int MAX = 100; 3 public static int count = 0; 4 public static int[] array = new int[MAX / 2 + 1]; 5 6 public static void main(String[] args) { 7 for (int i = 0; i <= MAX; i++) { 8 if (SosuCheck(i)) { 9 array[count] = i; 10 count += 1; 11 } 12 } 13 // 出力 14 for (int i = 0; i < count; i++) { 15 System.out.print(array[i] + " "); 16 } 17 } 18 19 public static boolean SosuCheck(int i) { 20 if (i == 2) { 21 return true; 22 } 23 // 判定数値を偶数で割れた場合は奇数ではない 24 if (i % 2 == 0 || i < 2) { 25 return false; 26 } 27 28 for (int kisuu = 3; kisuu <= Math.sqrt(i); kisuu += 2) { 29 if (i % kisuu == 0) { 30 return false; 31 } 32 } 33 return true; 34 } 35}

投稿2020/04/12 08:28

katoy

総合スコア22324

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

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

0

ベストアンサー

SosuCheckで素数と判定されると、配列に素数が入ってjが1増えます。
最初の素数は2なので、2が配列の0番目に入り、この時jが1となります。
もしここで終わった場合、sosuMaxが1となるので、ソートで配列の0番目と1番目をソートしてしまいます。
1番目は初期化した時点から何も変化していないため0であるため、0が先頭(0番目)に、2が1番目に並びます。
そして出力時も0番目と1番目が出力されるため、0と2が出力される結果となります。

そもそも配列に収めている時点で小さいほうから順に収めているため、ソートの必要性がないです。
根本的な問題として、エラトステネスの篩などを使ったほうがいいというのもあります。

回避するには、出力のfor文を

java

1/* 誤 */ for(i = 0; i <= sosuMax; i++) 2/* 正 */ for(i = 0; i < sosuMax; i++)

のように修正する必要があります(イコールを消した)。

投稿2020/04/12 03:52

編集2020/04/12 03:55
swordone

総合スコア20669

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

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

0

0が素数ではないのはわかりきっているので、0は削って1~100までの素数を表示するようなプログラムにすればいいのでは?
つまり、12行目の

Java

1for(i = 0; i <= MAX; i++)

Java

1for(i = 1; i <= MAX; i++)

とすればいいのではないでしょうか。
または、0を素数としないようにSosuCheck()内に

Java

1if (i == 0) return false

を追加すればいいのではないでしょうか。

投稿2020/04/12 03:28

編集2020/04/12 03:42
chika3742

総合スコア113

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

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

episteme

2020/04/12 03:54

SosuCheck() 内の //判定数値を偶数で割れた場合は奇数ではない if(i % 2 == 0 || i < 2) { return false; } によって 0, 1, 偶数に対してはfalseを返すので件の問題とは無関係では?
chika3742

2020/04/12 04:21

すみません、よく読まずに回答してました。
guest

0

// 昇順
の直前に:
System.out.printf("array[%d] = %d\n",sosuMax, array[sosuMax]);
すると、
array[28] = 0
と出力されます。
コレも素数に含まれ、array[0]~array[28] をソートしてんじゃないですか?

投稿2020/04/12 03:19

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問