100未満の素数を表示する方法

このQ&Aのポイント
  • 0~99までの配列を用意し、100の平方根である10までの素数の倍数を素数でない数としていく。
  • 2の倍数、3の倍数、5の倍数、7の倍数を表示し消去する方法を教えてください。
  • 100未満の素数を出力するプログラムのコード
回答を見る
  • ベストアンサー

100未満の素数を表示するには

100未満の素数を表示するには 「0~99までの配列を用意し、100の平方根である10までの素数の倍数を素数でない数としていく。」 実行例の一部「2の倍数を消去:468…96 98」 というように次は3の倍数、5の倍数、7の倍数を表示させ、それらに該当しないのを表示せよという問題です。 ヒントとして↓がもともと書かれていたんですが、ヒントがよくわかりません。 2の倍数を表示し消去する方法を教えてください。 #include<stdio.h> int main() { int i,j,prime[100]; for (i=0;i<N;i++) prime[i]=1; //全ての要素を素数の候補とする prime[0]=prime[1]=0; //0と1は素数ではない printf("\n100未満の素数を出力\n"); return 0; }

  • drite
  • お礼率48% (19/39)

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

ヒント1 2以外の2の倍数を100まで表示 for ( i = 2; i * 2 <= 100; i++) { printf("%d ", i * 2); } ヒント2 消去というか0を代入 prime[2以外の2の倍数] = 0;

drite
質問者

補足

for (i=0;i<N;i++) prime[i]=1; //全ての要素を素数の候補とする prime[0]=prime[1]=0; //0と1は素数ではない このNは適当に変えていいってことですか? 宣言されてないですし…。 あとfor()のあとは{がつくと思うんですが、↑の場合 prime[i]=1; prime[0]=prime[1]=0; これが繰り返しされるってことでいいんですか?

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

>あとfor()のあとは{がつくと思うんですが、↑の場合 必ずしもそうではありません。 for文やif文では、 for (~) { /* 何かの文 */ } の「何かの文」が1個だけのとき、下記のように { と } を省略できます。 for (~) /* 何かの文(1個だけ) */

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

たとえば、 #include<stdio.h> #include<math.h> int main() { int i,j,prime[100],N=100; for (i=0;i<N;i++) { prime[i]=i; //全ての要素を素数の候補とする } prime[0]=prime[1]=0; //0と1は素数ではない for(j=2;j<sqrt(N);j++){ //math.hを使わなければ、j<10か for(i=j+1;i<N;i++){ if(prime[i]%j==0){ if(prime[i]!=0) printf("%dの倍数 %d\n",j,prime[i]); //倍数の表示 prime[i]=0; } } } printf("\n%d未満の素数を出力\n",N); for (i=0;i<N;i++) { if(prime[i]!=0) printf(" %d\n",prime[i]); } return 0; }

回答No.2

http://ideone.com/qfDx3 定番、エラトステネスの篩…だけど。 なんか綺麗じゃなくて納得行かないorz #自分が組みたいときは、リスト使うだろうからね

関連するQ&A

  • 100未満の素数出力の最後

    100未満の素数出力の最後 #include<stdio.h> int main() { int i,j,prime[100]; int N=100; for(i=0;i<N;i++){ prime[i]=1; }//全ての要素を素数の候補とする prime[0]=prime[1]=0; //0と1は素数ではない printf("2の倍数:"); for(i=2;i*2<100;i++){ printf("%d ",i*2); prime[i];//←prime[i]に2の倍数を入れてるつもりです。 } prime[i]=0;//それを0にしてるつもりです。 printf("\n3の倍数:"); for(i=2;i*3<100;i++){ printf("%d ",i*3); prime[i];//同じく } prime[i]=0;//同じく printf("\n5の倍数:"); for(i=2;i*5<100;i++){ printf("%d ",i*5); prime[i];//同じく } prime[i]=0;//同じく printf("\n7の倍数:"); for(i=2;i*7<100;i++){ printf("%d ",i*7); prime[i];//同じく } prime[i]=0;//同じく printf("\n100未満の素数を出力\n"); for (i=0;i<N;i++){ printf("%d ",prime[i]!=0);//←prime[i]=0じゃないのを出力してるつもりなんですがうまく表示されません } return 0; } どうしたらいいでしょうか? 自分なりに考えても0か1しか表示されません;

  • 数十万番目の素数を表示させるプログラム

    以下のようなプログラムを作ってみたのですが、計算結果を出すのに大体10分くらいかかってしまいます。自分の知識の範囲でできる限りの工夫はしてみたのですが、10分はちょっと長すぎなのでもう少し短縮できる方法をどなたか教えてください。よろしくお願いします。 #include <stdio.h> #include <math.h> #include <time.h> int main(void) { int gakuseki,n,no,i,prime,j; time_t t1,t2; printf("学籍番号を入力して下さい。\n"); scanf("%d",&gakuseki); time(&t1); n=gakuseki%100000+900000; printf("%d番目の素数を計算中...\n",n); no=1; if(n==1){ i=2; }else{ i=1; while(no<n){ prime=1; i+=2; for(j=3;j<=sqrt(i);j+=2){ if(i%j==0){ prime=0; break; } } if(prime==1) no+=1; } } time(&t2); printf("%d番目の素数は%dです。\n",no,i); printf("計算時間は%ld秒でした。\n",t2-t1); return 0; }

  • 100000未満素数の総数を求めるのに困っているので教えてください。

    100000未満素数の総数を求めるのに困っているので教えてください。     #include<stdio.h> #include<math.h> #define NUM 100000 int main(void){ int prime[NUM+1],i,j,Limit; for(i=2;i<=NUM;i++){ prime[i]=1; } Limit=(int)sqrt(NUM); for(i=2;i<=Limit;i++){ if(prime[i]==1){ for(j=2*i;j<=NUM;j+=i){ prime[j]=0; } } } for ( i=2;i<=NUM;i++) {  if (prime[i]) {    printf("%d\n",i);   } } } これなんですが、実行したらエラーが出てしまうんですがなぜでしょうか?

  • 【c++】2進数の表示が上手くいきません

    サブ関数を利用して、-15~15までの値を1刻みで10進数16進数8進数2進数を表示するプログラムを作っているのですが悩んでいます。 以下のようにやってるのですがデバッグが上手くいきません。 どこが悪いのでしょうか? #include<stdio.h> void sub(int a) { int i,wc; for(i=31;i>=0;i--) { wc=(a>>i)&0x01; if(i%4==3) printf(" "); printf("%1d",wc); } printf("\n"); return; } int main(void) { int wc,a,s,j,b; printf("10進数,16進数,8進数,2進数\n"); for(s=-15;s<=15;s++) { printf("%d %x %o \n",s,s,s); printf("%d\n",sub(a)); } return 0; } 初心者なのでありえない間違えがあるかと思います。 ご教授お願いしますm(_ _)m

  • 引数で指定された配列の要素数の取得

    どうもこんにちは。 C言語でプログラムを作成しています。 ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか? 標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。 要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。 配列の要素数も引数として一緒に渡す必要がありますか? [作ってみたサンプル] #include <stdio.h> #include <stdlib.h> #include <string.h> // func1 と func2 をまとめられないだろうか。。。 void func1(int (*p)[10]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } void func2(int (*p)[5]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } int main(int argc, char *argv[]) { ________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 }; ________int ary2[5] = { 3, 6, 9, 12, 15 }; ________func1(&ary1); ________func2(&ary2); ________return 0; }

  • 関数とポインタ

    整数Mを素因数分解して、その素因数を*primeに入れておきたいんですが、mainの方で呼び出すと違う値になってしまいます。。 同じ値になるようにしたいのですが…どなたかお願いします(>_<) #include<stdio.h> #include<stdlib.h> #define MAX 256 int prime_fac(int M, int* prime) { int i, n; i = 1; n = 2; while(M != 1){ while(M % n == 0){ *(prime+i) = n; printf("%d\n", *(prime+i)); M = M / n; i++; } n++; } return i; /*素因数の個数(重複あり)*/ } int main(){ int M; int *prime; prime = (int *)malloc(sizeof(int) * MAX); printf("M: "); scanf("%d", &M); prime_fac(M, prime); printf("%d\n", *prime); printf("%d\n", *prime+1); free(prime); return 0; }

  • 素数であるかを判断するプログラムについて

    C言語を学習していて「独習C」48ページの次のプログラムが分かりませんでした。 ~~~~~~~~~~~~~~~~ #include <stdlib.h> #include <stdio.h> int main(void) { int num, i, is_prime; printf("判定したい数を入力してください"); scanf("%d", &num); /*ここからがわかりません*/ is_prime = 1; for(i=2; i<=num/2; i=i+1) if((num%i)==0) is_prime = 0; if(is_prime==1) printf("素数です"); else printf("素数ではありません"); return 0; } ~~~~~~~~~~~~~~~ 私はこうなると考えています。どこが間違っているでしょうか? numが0のとき、2<=0となり、素数 numが1のとき、2<=0.5となり、素数でない numが2のとき、2<=1となり、素数でない numが3のとき、2<=1.5となり、素数でない

  • C言語の問題です。よろしくお願いいたします。

    C言語の問題です.。10個の整数を入力し配列に保存した後、入力された数字の中に5の倍数が含まれているかを調べ、 含まれていた時には「5の倍数が含まれています」含まれていない時に「5の倍数が含まれていません」と表示させるプログラムを作りなさい。 自分なりに考えて作ったのですが、以下の通りでよろしいのでしょうか? #include <stdio.h> main() { int i; double c[10]; for (i = 0; i < 10; i++) { printf("整数を10個入力してください.(%d つ目) : ", i+1); scanf("%lf", &c[i]); } if(c[i] % 5 == 0){ printf("5の倍数が含まれています\n"); } else{ printf("5の倍数が含まれていません\n"); } return 0; }

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • 一次元配列の添え字の出力について

    配列matを以下のように宣言し、要素の値が2の倍数、または3の倍数ならば、その添え字を書き出すプログラムを作成しています。が、どうにも上手くいかなくて困ってます。条件式に誤りがあるのだと思いますが、解る方、何処が間違っているのか教えてください。 すぐに回答が欲しいです。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { if(mat[i]/ 2==1 || mat[i]/ 3==1){ printf("%d",i); } } printf("\n"); return(0); }