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

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

ただいまの
回答率

90.48%

  • Java

    14126questions

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

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

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 430

idontknow

score 3

 前提・実現したいこと

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まで判定できるのですが、それ以降の素数を素数として判定してくれません。

 該当のソースコード

import java.util.ArrayList;

public class GeneratePrimes{

ArrayList<Integer> primelist = new ArrayList<>();

    void prime(String[] args){
        check(args);
        print(args);
    }

    void check(String[] args){
        Integer max = 200;
        if(args.length!= 0){
            max = Integer.parseInt(args[0]);
        }

        for(Integer i = 2;i<=max;i++){
            for(Integer j = 2; j <= i; j++){
                if( i % j == 0 &&  i!= j){
                    //System.out.printf("i: %s  j: %s" ,i,j);
                    //System.out.println("");
                    break;
                }
                if( i == j) {
                primelist.add(i);
                //System.out.printf("Prime i: %s  j: %s" ,i,j);
                //System.out.println("");
                }
            }
        }
    }

    void print(String[] args){
        for(Integer k=0; k<primelist.size(); k++){
            System.out.printf("  %s",primelist.get(k));
            if((k+1)%10==0) System.out.println("");
        }
        System.out.println("");
    }

    public static void main(String[] args){
        GeneratePrimes app = new GeneratePrimes();
        app.prime(args);
    }
}

 試したこと

動作を確認するために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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+13

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

for(int i = 2;i<=max;i++){
    for(int j = 2; j <= i; j++){
        if( i % j == 0 &&  i!= j){
            break;
        }
        if( i == j) {
            primelist.add(i);
        }
    }
}

なぜなのか?

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/27 18:40

    すっきりしました!

    キャンセル

+2

こんにちは、原因は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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

import java.util.ArrayList;
import java.util.List;

public class GeneratePrimes {
    private List<Integer> primelist = new ArrayList<>();

    void prime(String[] args) {
        generate(args);
        print();
    }

    void generate(String[] args) {
        Integer max = args.length == 0 ? 200 : Integer.parseInt(args[0]);

        for (Integer i = 2; i <= max; i++) {
            Boolean is_p = true;
            // [2 .. i / 2 ] で割った時に割り切れるものがあるか?
            // (実際には SQRT(i) まで試せば十分)
            // さらには、すでに求めた素数を利用すると、計算量はさらに減らせる
            for (Integer d = 2; d <= i / 2; d++) {
                if (i % d == 0) {
                    is_p = false;
                    break;
                }
            }
            if (is_p) {
                primelist.add(i);
            }
        }
    }

    void print() {
        for (Integer i = 0; i < primelist.size(); i++) {
            System.out.printf("%4d", primelist.get(i));
            if ((i + 1) % 10 == 0) {
                System.out.println();
            }
        }
        System.out.println();
    }

    public static void main(String[] args) {
        GeneratePrimes app = new GeneratePrimes();
        app.prime(args);
    }
}


実行例
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

余計な口出ししちゃう

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    c言語のコードに一部誤りがあるようですがそれがどこなのかわかりません

    ある自然数nを素数の足し算に分割し、その組み合わせの数を求めるプログラム(例えば5なら5、2+3。8なら、2+2+2+2、2+3+3、3+5といったような分け方。n=0なら1が結果

  • 受付中

    10進数から16進数に変換

    10進数を入力すれば16進数に変換されるというプログラムを作っているのですがいまいちうまくいきませんどこがまちがっているのでしょうか? import java.io.IOExce

  • 受付中

    素数を出力

    c言語 入力した数までの素数を出力するプログラムの 偶数をチェック対象から外した場合です これを3の倍数をチェック対象から外した場合に 書き直したものを教えて下さい fo

  • 解決済

    100になる直前の加算結果出力

    javaで開始値と終了値を入力してその間の偶数を加算していき、合計が100を超えたら「数値が100を超えたため、処理を中止します。」とメッセージを出し、かつ合計が100になる前の加

  • 解決済

    入力した値を表示させない方法

    初めまして。現在JAVAを学んでいる初心者です。 現在、配列に格納している値を表示させるプログラムを作っています。 ユーザーから入力があった場合、次に配列の値を表示させるとき、

  • 解決済

    Eclipseでデバッグ中に、jarファイルのソースを見たい

    いつもお世話になります。今、springframwork4について勉強しています。 そのなかで、入力チェック等で設定がうまくいかず、悩んでしまうことがたびたびあります。 ecl

  • 解決済

    [Java]SQLへのBitSet型データの保存について

    前提・実現したいこと 【質問】BitSet型とString型を相互に変換する方法が知りたいです。 【状況】 現在Javaを用いて開発を行っているのですが、その過程で大量の

  • 解決済

    ArrayListに任意の値を上限まで格納する方法について

    javaのリストの中に任意のint型数値(1)を上限まで格納させたいのですが、方法が分かりません。 下記のソースを作ってみたのですが、当たり前のことながら1が一つ格納されているだけ

同じタグがついた質問を見る

  • Java

    14126questions

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