@YAT
Revisions
Report this question
Subscribe question
Help us understand the problem. What is going on with this question?
Q&A

素数判定プログラムの書き方

Q&A

解決したいこと

素数判定プログラムを、int sosu関数を用いて実装したいのですが、以下の部分をどう直したらいいのかがわかりません。

該当するソースコード

int sosu(int x)
{
    int i, result;

    result = 1; /* 素数と仮定 */
    if (x == 1) {
        result = 0;
    } else if (x != 2) {
        i=2;
        while ( i<x ) {
            if (x % i == 0) {
                result = 0;
            }
            (ここに何かを入れるのだとは思っていますが、何を入れたらいいのかがわかりません)
        }
    }
    return result;
}

0
3
Answer

そこに入るのはi++;です。
あるいは、i += 1;でも、i = i + 1;でも、++i;としても結果は同じです。

以下のように、break;を入れると、余分な処理を減らせます。

    if (x % i == 0) {
        result = 0;
        break; // 素数でないことが確定したのでループを抜ける
    }
    i++; // iをひとつ増やす

蛇足

forを使って、以下のように書くこともできます。

forを使ったコード
#include <stdio.h>

// 素数かどうかを判定する
int sosu (int x) {
    if (x <= 1) {
        return 0; // 素数は1より大きい
    } else /*if (x != 2)*/ { // 2は計算するまでもないけど、計算してもよし
        for (int i = 2; i < x; i++) {
            if (x % i == 0) {
                return 0; // 約数を発見した
            }
        }
    }
    return 1; // 約数がなかった
}

int main (void) {
    for (int i = 2; i < 20; i++) {
        if (sosu (i)) {
            printf ("%d, ", i);
        }
    }
}
結果
2, 3, 5, 7, 11, 13, 17, 19, 
1
回答ありがとうございます。
「蛇足」でfor文を使用した方法や、他にも詳しい説明を入れてくれたので、とても理解が深まりました。
僅かでもお役に立てたのでしたら何よりです。

ソースを貼り付ける場合は、例えばC言語なら「```c:」と書くことで、構文解釈に基づいた色づけが行われて読みやすくなります。
「```c:FileName.c」などとファイル名を付けることもできます。
詳しくは、以下のQiita公式ヘルプの「コードの挿入」をご覧ください。
https://qiita.com/Qiita/items/c686397e4a0f4f11683d#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5

既に投稿した質問でも、再度編集して書き替えることができます。
記事の右上辺りに「編集する」リンクがあると思います。
View the remaining 1 comments.

他の方が書かれているので、これは別解として、このような書き方も出来ますよ

#include <stdio.h>

int sosu(int x) {
    int i=2;
    if (x <= 0) return 0;
    if (x==1) return 1;
    while(x%i!=0) {
        i++;
    }
    if (x==i) return 1;
    else return 0;
}

int main(void){
    int n=97;
    printf("%dは%s\n", n, (sosu(n))?"素数です":"素数ではありません");
    return 0;
}
0
Report this answer

こんな感じでどうでしょう。

int sosu(int x)
{
    int i, result;

    result = 1; /* 素数と仮定 */
    if (x == 1) {
        result = 0;
    } else if (x != 2) {
        i=2;
        while ( i<x ) {
            if (x % i == 0) {
                result = 0;
                break;
            }            
            i++;
        }
    }
    return result;
}
0
回答ありがとうございます。
Help us understand the problem. What is going on with this answer?
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login