「素数を求める(1)」(1993/06/08)
要求仕様:
2〜10000までの整数nを入力させ,
全てのそれ以下の素数とその個数を表示するプログラムを作れ。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
sosuu.c
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

#include <stdio.h>

main(int argc,char *argv[])
{
int n;
        if (argc<2) { /* 引数が足りない */
                printf("¥aSOSUU n (n=2〜10000)¥n");
                exit(1);
        }
        n=atoi(argv[1]);
        if (n<=1||n>10000) {
                printf("¥anの範囲が異常です(n=2〜10000):%d¥n",n);
                exit(2);
        }
        n=sosuu(n); /* 素数算出 */
        printf("素数の数:%d¥n",n);
        exit(0);
}

int sosuu(int n)
/* nまでの素数を求める */
/* 素数とは1とそれ自身でしか割り切れない数 */
/* 1は素数ではない(定義) */
{
int nn=1,s,ss;
        for (s=2;s<=n;s++) {
                for (ss=2;(s%ss)!=0;ss++); /* s==ssでは絶対に割切れ終了する */
                if (ss==s) {
                        printf(",%d",s);
                        nn++;
                }
        }
        printf("¥n");
        return(nn);
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

良い方法が思い浮かばなかったので素直に「1とそれ以外では割り切れない数」
ということで求めています。世の中にはもっと良い方法があるかも知れません。
このプログラムは非常に簡単になっているのが特徴ですが。

素数かどうかの判定は基本的に関数sosuu()内の2つ目のfor()文だけで求められて
います。ここではfor()文の有効的利用法というやつを使って少しでも高速化する
ために判定を少なくしています。(実はそんなに変わりませんが。)
こんな風にfor()文を使ったのは私も始めてです。Cの文法をよく知っておけば
このような書き方もできることはわかるのですがね。

ちなみに100までの素数を求めると次のようになります。

素数: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
素数の数:25

これくらいなら一瞬にして求まりますし、10000まで1230個の素数を求めても
3分以下で済みます。(X68000 12MHzの場合。正確には2:37。
ちなみに386/20MHzでは30秒とかかりません。計算だけは速い86系。)
こういった力任せの計算はコンピューターのお得意ですな。
速い速い。

というところで今回はおしまい。

・・・2003/04/02修正
1は素数ではないと指摘を受けましたので修正しました。
<戻る>