fork download
  1. // [名前] sosu.c
  2. // [機能] 素数
  3. // [コンパイル]
  4. // gcc -o sosu sosu.c -lm
  5. #include<stdio.h>
  6. #include<math.h>
  7.  
  8. // 実際に割ってみて、割切れるかどうかで素数判定
  9. // (d > 2 であること)
  10. int sosuu_desuka(int d)
  11. {
  12. int waru, kokomade;
  13.  
  14. // 3以上かつ偶数か?
  15. if ((3 <= d) && (d % 2 == 0)) {
  16. return 0;
  17. }
  18. // 割る数の最大値
  19. kokomade = (int) sqrt((double) d);
  20. // 実際に割ってみる(3以上の奇数のみで)
  21. for (waru = 3; waru <= kokomade; waru += 2) {
  22. if (d % waru == 0) {
  23. // 割り切れたので素数ではありませんでした
  24. return 0;
  25. }
  26. }
  27. // 素数でした
  28. return 1;
  29. }
  30.  
  31. int main()
  32. {
  33. int i; // ループ用
  34. int ch; // 動作モード
  35. int max; // 最大値
  36. // ch=='v'の時は、求める素数の最大値を意味する
  37. // ch=='n'の時は、求める個数を意味する
  38. int count; // 個数カウント用
  39.  
  40. // 入力
  41. fprintf(stderr, "素数を求めます\n");
  42. fprintf(stderr, " [v]指定した値までの素数を求める\n");
  43. fprintf(stderr, " [n]指定した個数の素数を求める\n");
  44. ch = getchar();
  45. if (ch == 'v') {
  46. fprintf(stderr, "いくつまでの素数を求めますか?(2~) = ");
  47. scanf("%d", &max);
  48. if (max < 2) {
  49. fprintf(stderr, "2以上を指定してください\n");
  50. return 1;
  51. }
  52. } else if (ch == 'n') {
  53. fprintf(stderr, "いくつ素数を求めますか?(1~) = ");
  54. scanf("%d", &max);
  55. if (max < 1) {
  56. fprintf(stderr, "1以上を指定してください\n");
  57. return 1;
  58. }
  59. } else {
  60. fprintf(stderr, "v か n を指定してください\n");
  61. return 1;
  62. }
  63.  
  64. // 表示
  65. if (ch == 'v') {
  66. printf("%dまでの素数 =", max);
  67. printf(" 2");
  68. for (i = 3; i <= max; i += 2) {
  69. if (sosuu_desuka(i)) {
  70. printf(" %d", i);
  71. }
  72. }
  73. } else {
  74. printf("素数%d個 =", max);
  75. printf(" 2");
  76. count = 1;
  77. for (i = 3;; i += 2) {
  78. if (count >= max) {
  79. break;
  80. }
  81. if (sosuu_desuka(i)) {
  82. printf(" %d", i);
  83. count++;
  84. }
  85. }
  86. }
  87. printf("\n");
  88.  
  89. // 終了
  90. return 0;
  91. }
Success #stdin #stdout 0.01s 1680KB
stdin
n
8
stdout
素数8個 =  2 3 5 7 11 13 17 19