• ベストアンサー

2から120以下の素数を求める

2以上120以下の素数を全て求めて表示するプログラムを書きなさい。 素数か否かの判定には以下のアルゴリズム[処理手順] (2 <= n <= 120のときのみ有効)を用いなさい。 i) nが2, 3, 5, 7, 11のうちのどれかと等しければNは素数 ii) nが2, 3, 5, 7, 11の全てに対して割切れなければNは素数 iii) それ以外(iもiiも不成立)のとき、Nは素数ではない。 *) 2, 3, 5, 7, 11は最初に出力してしまい、 n=12から120までをfor文のなかで判定すればよい。 というC言語の課題です。 自分でプログラムを作ったのですが、うまくできません・・。 if文が働いてないようなのですが、どこが間違っているのでしょうか? #include <stdio.h> int main(void) { int i; printf("2\n"); printf("3\n"); printf("5\n"); printf("7\n"); printf("11\n"); for (i=12;i<=120;i++){ if (i%2!=0 || i%3!=0 || i%5!=0 || i%7!=0 || i%11!=0){ printf("%d\n",i); } else{ printf(""); } } printf( "\n" ); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ii) nが2, 3, 5, 7, 11の『全て』に対して割切れなければNは素数 ですから ifの条件設定がおかしいですよ たとえば 12の場合 ( 12 % 2 ) != 0 ... FALSE ( 12 % 3 ) != 0 ... FALSE ( 12 % 5 ) != 0 ... TRUE ( 12 % 7 ) != 0 ... TRUE ( 12 % 11 ) != 0 ... TRUE ということは 12は 2と3の倍数ということになります したがって『素数ではない』と判断出来ます ||演算子でこの判断が可能なのでしょうか 蛇足 12は 2と3の倍数である事は明らかなので 13から検査すればいい ループカウントアップを1にするより 2としてやれば偶数のチェックはしなくて済む ループの終了条件も n<=120 120は当然偶数なので2の倍数であるから 『<=』の『=』は不要かも

kittypink7
質問者

お礼

ifの条件設定が変だったんですね・・ ありがとうございます!解決しました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

(へ) 理屈的には「偶数は iii) に落ちるので最初から無視した」といえばいいと思います>#2. もっといえば, 120以下の素数を見付けるなら 11 で割切れるかどうかの判定も不要だけど (課題としては) まずいんだろうなぁ.

kittypink7
質問者

お礼

11で割り切れる判定もいらないんですね・・ ただ手順通りにと指定されているので 今回はこのまま提出します。 ありがとうございました!

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

|| ではなく && ですね。 よく条件を考えてください。 まあ、課題が妥当かどうかは別として、課題でしてされているんで、 奇数だけとか、13からとかはルール違反になるんでしょうね。

kittypink7
質問者

お礼

&&でやってみたところ、うまくできました! ありがとうございます! 一応課題の通り12からにして提出します。

関連するQ&A

  • 素数を判定するプログラム

    素数を判定するプログラムをC言語で作れという問題があったのですが、以下のものをビルドして実行したら途中で止まってしまいました。(例えば5と入力する)しかし、1以下の場合は正常にif文が評価されました。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n; int i; printf("1より大きい整数を入力してください: "); scanf("%d", &number); if (number <= 1) { printf("1より大きい整数を入力してください\a: "); scanf("%d", &number); } for (n = 2; n = number - 1; n++) { i = number % n; if (i = 0) { printf("%dは素数ではありません", number); break; } } printf("%dは素数です", number); return 0; } 自分ではどこがおかしいのかさっぱりわかりません。よろしくお願いします。

  • 改行について パート2

    改行には\nを使いますがfor文やif文をたくさん使う場合のときはいったいどこに「3つごとに改行」などのif文を入れたらよいですか。 素数を100まで求めるとするとき以下のプログラミングになると思いますが。 #include <stdio.h> main() { int i,n; for (n == 2 ; n <= 100 ; n++){ for (i=2; i<n ;i++){ if(n%i == 0){ break; } } if(i == n){ printf("%d ",i); } } } では、3つごとに表示するときは   if(i%3==0){ printf("\n"); } と、文はこうなると思います。これはどこに書き加えたらいいですか

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • 素数を判定するプログラム

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。

  • JAVAで素数判定

    JAVAの勉強をしてます 練習問題で、素数判定のプログラムをしているのですが。 1~14までの判定はうまくいきますが、15の判定の時に素数であると表示されて困ってます。どなたかわかりませんか? //読み込んだ数字 n が 15 の場合 if(n == 1) System.out.println("素数ではありません。"); if(n == 2) System.out.println("素数です。"); for (int i = 2; i < n; i++) { if (n % i == 0) { System.out.println("素数ではありません。"); break; } else { System.out.println("素数です。"); break; } } --結果---------------------------------------------- 素数です

    • ベストアンサー
    • Java
  • 素数 再帰関数

    メイン #include<stdio.h> extern void count_primes(void); extern void print_primes(void); int max; int count; int primes[1000] int main(void) { printf("Uper limit: "); scanf("%d",&max); count_primes(); print_primes(); } 素数を求める(関数呼び出し) extern int nextprime(int n); extern int max; extern int count; extern int primes[]; void count_primes(void) { int i; count=0; for(i=2;i<=max;i=nextprime(i)){ primes[count++]=i; } リカーバシブ(次の素数) int nextprime[int n] { int i; for(;;){ n++; for(i=2;i*i<=n;i=nextprime(i)){ if(n%i==0) break; } if(i*i>n) break; } return n; } 素数プリント #include<stdio.h> extern int count; extern int primes[]; void print_primes(void) { int i for(i=0;i<count;i++){ if((i>0)&&(i%10==0) printf("\n"); printf(" %6d",primes[i]); } printf("\n素数の数 %d\n",count); } これら4つのモジュールで素数 nが求められますがアルゴリズム理解できません。この2つの関数のアルゴリズムについて、ご教授ください。め

  • 【C→JAVA】素数の組の数を求めるプログラム

    以下はC言語のプログラムです。 標準入力に正の偶数値 n(2≦n≦10,000) を入力すると足して n になる素数の組の数を求め、 標準出力に出力するプログラムなのですが、 これをJAVA用のプログラムに置き換えるとすると どのようなプログラムになるのでしょうか? よろしくお願いいたします。 #include <stdio.h> #include <math.h> //Compiler version gcc 6.3.0 #define N 10000 int primes[N + 1] = {0}; void sieve(int); int main() { int n,count = 0; sieve(N); scanf("%d",&n); for (int i = 1;i <= n / 2 + 1;i++) { for (int j = i + 1;j < n;j++) { if (primes[i] && primes[j] && i + j == n) { count++; } } } printf("%d\n",count); return 0; } void sieve(int n) { int limit = (int)sqrt(n) + 1; for (int i = 2;i <= n;i++) { primes[i] = 1; } for (int i = 2;i < limit;i++) { if (primes[i]) { for (int j = 2; i * j <= n;j++) { primes[i * j] = 0; } } } }

  • C言語 素数判定

    1000以下の素数を求めるプログラム kadai7-2.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 という問題なのですが、以下のプログラムを実行しても動きませんでした。どこが違うのでしょうか。ご指摘お願いします。 #include<stdio.h> #include<math.h> main(){ int i,j,ix,k,h; for (i=2;i<=1000;i++){ ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++){ if(i%j==0){ k=1; } } if(k==0){ printf("%4d",i); h+=1 if(h=15){ printf("\n"); h=0; } }

  • 素数は何%くらいあるか

    高1です。 素数が何%くらいあるかを調べてみようと思い、次のようなBasicプログラムを作りました。 -------------------------------------------------------- 100 cls:count=1:print 2;" ";100;"%";" ";count 110 for i=3 to 10000000 120 n=i 130 if (n - int(n/2)*2) = 0 then goto 220 140 for j = 3 to sqr(n) step 2 150 if (n - j * int(n/j) ) = 0 then goto 220 160 end if 170 next j 180 count=count + 1 190 p = count*100 / (n - 1) 200 percent = (int(p * 10))/10 210 print n;" ";percent;" ";"%";" ";count 220 next i 230 end -------------------------------------------------------- 【各行の意味】 100  2は素数 110  3から一千万まで調べる 130  偶数は除外 140~ 素数判定(自然数nが√n以下のすべての数で割りきれなければ、nは素数である、を利用) 180  素数の個数をカウントする 190~ 素数が何%あるかを少数第一位まで求める。少数第二位以下は切り捨て。 210  素数、%、素数の個数 を表示 -------------------------------------------------------- 【結果】 千までに素数は168個、16.8% 一万までに素数は1229個、12.3% 十万までに素数は9592個、9.5% 百万までに素数は78498個、7.8% 一千万までに素数は664579個、6.6% -------------------------------------------------------- そこで質問ですが、 1.素数の割合は収束する傾向にあると言えるでしょうか? 2.プログラムに間違いがありましたら、教えていただけないでしょうか。 3.素数の割合に関するわかりやすい本(高校生でも理解できるようなもの)などがありましたら、教えていただけないでしょうか。 ちなみに、これは学校の宿題や課題ではありません。純粋に個人的な興味で調べたものですが、何か結論みたいなものが導けたら来年の自由研究に出してみたいと思っています。 使用機種:Mac 使用ソフト:chipmunk basic(フリーソフト) 機種が非力なので1億や10億といった計算はやっていません。

  • 10個出力で改行したいのですが・・・

    #include <stdio.h> main() { int i, n; for( i = 1, n = 0; n < i; i++ )    { if(i%3 == 2 && i%4 == 1 && i<1000 ) {  printf("%4d,",i);   if(i%10==0)        printf("\n");    n++;       }    } printf("\n"); } このプログラムは、3で割ると2余り、4で割ると1余る自然数で1000より小さいものを小さい順に表示するもので、 一行に10個ずつ表示して改行したいのですが、どうすればいいでしょうか? if文が間違っていると思うのですが・・・

専門家に質問してみよう