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

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

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

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

Q&A

解決済

5回答

3260閲覧

素数判定できない(基礎レベルです。)

idontknow

総合スコア12

Java

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

0グッド

0クリップ

投稿2018/04/27 05:27

前提・実現したいこと

Javaで素数を表示したいです。
1〜コマンドライン引数で入力された数まで(入力されなかったら200まで)
の内で素数であるものを判定し、10個置きに表示する。

理想結果
$ java Primes
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199
$ java Primes 59
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59

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

自分の書いたコードでは、127まで判定できるのですが、それ以降の素数を素数として判定してくれません。

該当のソースコード

Jaca

1import java.util.ArrayList; 2 3public class GeneratePrimes{ 4 5ArrayList<Integer> primelist = new ArrayList<>(); 6 7 void prime(String[] args){ 8 check(args); 9 print(args); 10 } 11 12 void check(String[] args){ 13 Integer max = 200; 14 if(args.length!= 0){ 15 max = Integer.parseInt(args[0]); 16 } 17 18 for(Integer i = 2;i<=max;i++){ 19 for(Integer j = 2; j <= i; j++){ 20 if( i % j == 0 && i!= j){ 21 //System.out.printf("i: %s j: %s" ,i,j); 22 //System.out.println(""); 23 break; 24 } 25 if( i == j) { 26 primelist.add(i); 27 //System.out.printf("Prime i: %s j: %s" ,i,j); 28 //System.out.println(""); 29 } 30 } 31 } 32 } 33 34 void print(String[] args){ 35 for(Integer k=0; k<primelist.size(); k++){ 36 System.out.printf(" %s",primelist.get(k)); 37 if((k+1)%10==0) System.out.println(""); 38 } 39 System.out.println(""); 40 } 41 42 public static void main(String[] args){ 43 GeneratePrimes app = new GeneratePrimes(); 44 app.prime(args); 45 } 46}

試したこと

動作を確認するためにi,jを出力してみたのですが、なぜか以下のようになります。

$ java GeneratePrimes
Prime i: 2 j: 2
Prime i: 3 j: 3
i: 4 j: 2
Prime i: 5 j: 5
i: 6 j: 2
Prime i: 7 j: 7
i: 8 j: 2
i: 9 j: 3
i: 10 j: 2
Prime i: 11 j: 11
i: 12 j: 2
Prime i: 13 j: 13
i: 14 j: 2
i: 15 j: 3
i: 16 j: 2
Prime i: 17 j: 17
i: 18 j: 2
Prime i: 19 j: 19
i: 20 j: 2
i: 21 j: 3
i: 22 j: 2
Prime i: 23 j: 23
i: 24 j: 2
i: 25 j: 5
i: 26 j: 2
i: 27 j: 3
i: 28 j: 2
Prime i: 29 j: 29
i: 30 j: 2
Prime i: 31 j: 31
i: 32 j: 2
i: 33 j: 3
i: 34 j: 2
i: 35 j: 5
i: 36 j: 2
Prime i: 37 j: 37
i: 38 j: 2
i: 39 j: 3
i: 40 j: 2
Prime i: 41 j: 41
i: 42 j: 2
Prime i: 43 j: 43
i: 44 j: 2
i: 45 j: 3
i: 46 j: 2
Prime i: 47 j: 47
i: 48 j: 2
i: 49 j: 7
i: 50 j: 2
i: 51 j: 3
i: 52 j: 2
Prime i: 53 j: 53
i: 54 j: 2
i: 55 j: 5
i: 56 j: 2
i: 57 j: 3
i: 58 j: 2
Prime i: 59 j: 59
i: 60 j: 2
Prime i: 61 j: 61
i: 62 j: 2
i: 63 j: 3
i: 64 j: 2
i: 65 j: 5
i: 66 j: 2
Prime i: 67 j: 67
i: 68 j: 2
i: 69 j: 3
i: 70 j: 2
Prime i: 71 j: 71
i: 72 j: 2
Prime i: 73 j: 73
i: 74 j: 2
i: 75 j: 3
i: 76 j: 2
i: 77 j: 7
i: 78 j: 2
Prime i: 79 j: 79
i: 80 j: 2
i: 81 j: 3
i: 82 j: 2
Prime i: 83 j: 83
i: 84 j: 2
i: 85 j: 5
i: 86 j: 2
i: 87 j: 3
i: 88 j: 2
Prime i: 89 j: 89
i: 90 j: 2
i: 91 j: 7
i: 92 j: 2
i: 93 j: 3
i: 94 j: 2
i: 95 j: 5
i: 96 j: 2
Prime i: 97 j: 97
i: 98 j: 2
i: 99 j: 3
i: 100 j: 2
Prime i: 101 j: 101
i: 102 j: 2
Prime i: 103 j: 103
i: 104 j: 2
i: 105 j: 3
i: 106 j: 2
Prime i: 107 j: 107
i: 108 j: 2
Prime i: 109 j: 109
i: 110 j: 2
i: 111 j: 3
i: 112 j: 2
Prime i: 113 j: 113
i: 114 j: 2
i: 115 j: 5
i: 116 j: 2
i: 117 j: 3
i: 118 j: 2
i: 119 j: 7
i: 120 j: 2
i: 121 j: 11
i: 122 j: 2
i: 123 j: 3
i: 124 j: 2
i: 125 j: 5
i: 126 j: 2
Prime i: 127 j: 127
i: 128 j: 2
i: 129 j: 3
i: 130 j: 2
i: 131 j: 131
i: 132 j: 2
i: 133 j: 7
i: 134 j: 2
i: 135 j: 3
i: 136 j: 2
i: 137 j: 137
i: 138 j: 2
i: 139 j: 139
i: 140 j: 2
i: 141 j: 3
i: 142 j: 2
i: 143 j: 11
i: 144 j: 2
i: 145 j: 5
i: 146 j: 2
i: 147 j: 3
i: 148 j: 2
i: 149 j: 149
i: 150 j: 2
i: 151 j: 151
i: 152 j: 2
i: 153 j: 3
i: 154 j: 2
i: 155 j: 5
i: 156 j: 2
i: 157 j: 157
i: 158 j: 2
i: 159 j: 3
i: 160 j: 2
i: 161 j: 7
i: 162 j: 2
i: 163 j: 163
i: 164 j: 2
i: 165 j: 3
i: 166 j: 2
i: 167 j: 167
i: 168 j: 2
i: 169 j: 13
i: 170 j: 2
i: 171 j: 3
i: 172 j: 2
i: 173 j: 173
i: 174 j: 2
i: 175 j: 5
i: 176 j: 2
i: 177 j: 3
i: 178 j: 2
i: 179 j: 179
i: 180 j: 2
i: 181 j: 181
i: 182 j: 2
i: 183 j: 3
i: 184 j: 2
i: 185 j: 5
i: 186 j: 2
i: 187 j: 11
i: 188 j: 2
i: 189 j: 3
i: 190 j: 2
i: 191 j: 191
i: 192 j: 2
i: 193 j: 193
i: 194 j: 2
i: 195 j: 3
i: 196 j: 2
i: 197 j: 197
i: 198 j: 2
i: 199 j: 199
i: 200 j: 2

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答5

0

ベストアンサー

整数型にIntegerを使っているからですね。intに変えるか、Object#equalsで比較してください。

Java

1for(int i = 2;i<=max;i++){ 2 for(int j = 2; j <= i; j++){ 3 if( i % j == 0 && i!= j){ 4 break; 5 } 6 if( i == j) { 7 primelist.add(i); 8 } 9 } 10}

なぜなのか?

Integerは参照型なので、==を使うと同値性ではなく同一性を比較してしまいます。
しかし、127までの数は効率化のためキャッシュされているので、==で比較できちゃったのです。

投稿2018/04/27 05:38

編集2018/04/27 05:40
LouiS0616

総合スコア35660

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

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

idontknow

2018/04/27 09:40

すっきりしました!
guest

0

こんにちは、原因はLouiS0616さんのおっしゃるとおりです。
別の書き方を説明したと思います。(参考程度にお願いします。)

私は、素数のチェックをするメソッドの戻り値をbooleanにしました。
素数ならtrue それ以外はfalseになります。

素数を表示するところで10個おきに改行するために
素数を数える変数countを用意してcountが10の倍数に時だけ改行するにようにしました。

私が、書いたソースコードを載せておきます。

public class Main { public static void main(String[] args){ Scanner sc= new Scanner(System.in); int n = sc.nextInt(); int count = 0; for(int i = 2; i <= n; i++){ if(check_prime(i)){ System.out.print(i + " "); count++; if(count % 10 == 0){ System.out.println(); } } } } public static boolean check_prime(int n){ boolean judge = false; if(1 < n && n <= 3){ judge = true; } for(int i = 2; i <= n / 2; i++){ if(n % i == 0){ judge = false; break; } else{ judge = true; } } return judge; } }

<結果>
n = 200の時

2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199

投稿2018/04/27 06:49

編集2018/04/27 06:55
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

余計な口出ししちゃう

1、
ある数が素数であるかの判定は、
その数以下の素数でだけ
剰余が0のものがないか判定すればいい

2、
Aが素数B以下に素因数を持たない場合
AはB^2より大きくない限り素数である

数が大きくなってくると+1ごと判定は結構きつくなってきますん

投稿2018/04/28 07:54

KazuhiroHatano

総合スコア7804

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

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

0

全部の素数がもとまらない理由は、他の回答の通りです。

質問文のコードを書き変えてみました。

java

1import java.util.ArrayList; 2import java.util.List; 3 4public class GeneratePrimes { 5 private List<Integer> primelist = new ArrayList<>(); 6 7 void prime(String[] args) { 8 generate(args); 9 print(); 10 } 11 12 void generate(String[] args) { 13 Integer max = args.length == 0 ? 200 : Integer.parseInt(args[0]); 14 15 for (Integer i = 2; i <= max; i++) { 16 Boolean is_p = true; 17 // [2 .. i / 2 ] で割った時に割り切れるものがあるか? 18 // (実際には SQRT(i) まで試せば十分) 19 // さらには、すでに求めた素数を利用すると、計算量はさらに減らせる 20 for (Integer d = 2; d <= i / 2; d++) { 21 if (i % d == 0) { 22 is_p = false; 23 break; 24 } 25 } 26 if (is_p) { 27 primelist.add(i); 28 } 29 } 30 } 31 32 void print() { 33 for (Integer i = 0; i < primelist.size(); i++) { 34 System.out.printf("%4d", primelist.get(i)); 35 if ((i + 1) % 10 == 0) { 36 System.out.println(); 37 } 38 } 39 System.out.println(); 40 } 41 42 public static void main(String[] args) { 43 GeneratePrimes app = new GeneratePrimes(); 44 app.prime(args); 45 } 46}

実行例
イメージ説明

投稿2018/04/28 07:11

katoy

総合スコア22324

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

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

0

「エラトステネスのふるい」で調べましょう。これなら==で比較したりする必要がないので。

投稿2018/04/27 13:29

swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問