// [名前] sosu.c
// [機能] 素数
// [コンパイル]
//      gcc -o sosu sosu.c -lm
#include<stdio.h>
#include<math.h>

// 実際に割ってみて、割切れるかどうかで素数判定
//  (d > 2 であること)
int sosuu_desuka(int d)
{
    int waru, kokomade;

    // 3以上かつ偶数か？
    if ((3 <= d) && (d % 2 == 0)) {
        return 0;
    }
    // 割る数の最大値
    kokomade = (int) sqrt((double) d);
    // 実際に割ってみる(3以上の奇数のみで)
    for (waru = 3; waru <= kokomade; waru += 2) {
        if (d % waru == 0) {
            // 割り切れたので素数ではありませんでした
            return 0;
        }
    }
    // 素数でした
    return 1;
}

int main()
{
    int i;                      // ループ用
    int ch;                     // 動作モード
    int max;                    // 最大値
                                //   ch=='v'の時は、求める素数の最大値を意味する
                                //   ch=='n'の時は、求める個数を意味する
    int count;                  // 個数カウント用

    // 入力
    fprintf(stderr, "素数を求めます\n");
    fprintf(stderr, "  [v]指定した値までの素数を求める\n");
    fprintf(stderr, "  [n]指定した個数の素数を求める\n");
    ch = getchar();
    if (ch == 'v') {
        fprintf(stderr, "いくつまでの素数を求めますか？(2～) = ");
        scanf("%d", &max);
        if (max < 2) {
            fprintf(stderr, "2以上を指定してください\n");
            return 1;
        }
    } else if (ch == 'n') {
        fprintf(stderr, "いくつ素数を求めますか？(1～) = ");
        scanf("%d", &max);
        if (max < 1) {
            fprintf(stderr, "1以上を指定してください\n");
            return 1;
        }
    } else {
        fprintf(stderr, "v か n を指定してください\n");
        return 1;
    }

    // 表示
    if (ch == 'v') {
        printf("%dまでの素数 =", max);
        printf("  2");
        for (i = 3; i <= max; i += 2) {
            if (sosuu_desuka(i)) {
                printf(" %d", i);
            }
        }
    } else {
        printf("素数%d個 =", max);
        printf("  2");
        count = 1;
        for (i = 3;; i += 2) {
            if (count >= max) {
                break;
            }
            if (sosuu_desuka(i)) {
                printf(" %d", i);
                count++;
            }
        }
    }
    printf("\n");

    // 終了
    return 0;
}