100未満の素数出力の最後

このQ&Aのポイント
  • 100未満の数の中で素数を出力し、最後に表示する方法について考えています。現在、コードを実行しても0か1しか表示されません。
  • コードは100未満の素数を見つけるためのアルゴリズムですが、現在の実装では正しく素数を表示できていません。
  • 素数を判定するためのフラグ配列を用意しているものの、フラグの更新が正しく行われていないことが原因で表示結果が正しくないようです。
回答を見る
  • ベストアンサー

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しか表示されません;

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

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

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

>prime[i]=i*2; >ですよね? 違います。 prime[]には、素数か素数でないか、つまり0か1しか入らない仕様ですよね。 2*iが素数でないことがわかったのですから、prime[2*i]=0;です。理解できますか?

drite
質問者

お礼

めっちゃ考えて、少しいじったら 無事表示させることができました。 頭の悪い自分に何度も教えてくださり ありがとうございます。 助かりました<(_ _)>

drite
質問者

補足

なるほど・・・!! 何度もありがとうございます。 いま、0から100までの素数を0と1で表現できるところまで来ました。 あとは0を表示させないようにすることと、 1を数値化することです。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> for(i=2;i*2<100;i++){ ・間違いではありませんが。 値を直接書かずに、変数やマクロに入れる、というのは、プログラムの保守の上で有効な手段です。 それなのに、せっかく N=100 と定義しているのに、ここで直接100と書いては台無しです。 > prime[i]; //←prime[i]に2の倍数を入れてるつもりです。 ・Cの文法としては正しいですが、まったくの何の影響もない文です。 変数等に何も代入していません。 prime[X] = 1 としてあることから 1 ; という文と同じです。 ・また、 > for(i=0;i<N;i++){prime[i]=1;}//全ての要素を素数の候補とする と御自身か書いているように、配列primeは「 Xが『素数の候補』ならprime[X] = 1 」としているのに、 > //←prime[i]に2の倍数を入れてるつもりです。 とはなんのつもりなのでしょう? 0でも1でもない 「2の倍数」をprime[X]に入れること自体おかしいです。 > prime[i]=0;//それを0にしてるつもりです。 ・直前のforループの継続条件は 「i * 2 < 100」でした。つまり「 i * 2 >= 100 」でループ終了です。 iが2から1ずつ増えているので、ループ終了時点で「 i * 2 == 100」すなわち i == 50です。 この文は、そのループ終了後の i を使用するので、 prime[50] = 0 ; ということになります。 この一連の動作で prime[X]=0となるのは X=50だけです。 アルゴリズムによっては、ループ終了時のループ制御変数(この場合は i )を利用して処理をする場合があります。 しかし、ほとんどのケースでループ制御変数はループの中でしか使いません。 特に、配列の添字として使う場合、配列の範囲外である場合が多く、「コンパイルではエラーにならない」(ここ重要)ものの、実行時に誤動作します。 例: for(i=0;i<100;i++) → ループ終了時 i = 100 なので、 ループの外でprime[i]とすると範囲外のprime[100]となる > printf("\n3の倍数:"); > printf("\n5の倍数:"); > printf("\n7の倍数:"); いくらコピペができるとは言え、書いていて面倒にならなかったですか? もし「1000未満の素数に変えなさい」という問題が出たら、できますか? 先人は「同じことを3度書いたら、ループ、マクロ、関数といった手段でまとめることを考えろ」と言いました。 何のための「素数候補の配列prime」でしょう?最後に結果を表示するだけのものではないです。 変数 j も定義してあるだけで使ってないですね。 > printf("%d ",prime[i]!=0);//←prime[i]=0じゃないのを出力してるつもりなんですがうまく表示されません C言語では、 !=(や==,<...など)を「比較演算子」と呼び、 「A 比較演算子 B」というのは、「AとBとを比較して、演算子の条件に合致していたら1(真)、そうでない場合は0(偽)」という「計算」をします。 (優先順位や計算方法の違いはあるものの) +,-,*,/といった「演算子」とまったく同じ扱いです。 つまり、この文は、 「prime[i]が0でない」なら printf("%d ", 1); か「prime[i]が『0でない」ではない」なら printf("%d ", 0); を実行しています。 「『prime[i]=0じゃないの』を出力」ではなく「『prime[i]=0じゃない』を出力」になっています。 表示したいのは prime[X] の値ではなく X の方ですよね? あと、if 文て覚えてますか?

drite
質問者

お礼

めっちゃ考えて、少しいじったら 無事、表示させることができました。 詳しいアドバイス、 本当にありがとうございました。 すごい助かりました<(_ _)>

drite
質問者

補足

まだ慣れていなくてforの中にforが入っていたら個人的にこんがらがってしまうので;; 表示したいのはprime[X]の値ではなくXです。 if文は学びました。

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

>prime[i];//←prime[i]に2の倍数を入れてるつもりです。 この文では、prime[i]に対して「何もしていません」。

drite
質問者

補足

おぉ。つまり prime[i]=i*2; ですよね? もう少しヒントがほしいです。

関連するQ&A

  • 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; }

  • 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)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • 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; }

  • 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文が間違っていると思うのですが・・・

  • 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);   } } } これなんですが、実行したらエラーが出てしまうんですがなぜでしょうか?

  • 関数とポインタ

    整数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; }

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

    以下のようなプログラムを作ってみたのですが、計算結果を出すのに大体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; }

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

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうも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; } どうかよろしくお願いします。

  • 2進→10進数

    2進数から10進数に変換するプログラムを作りたいんですが #include<stdio.h> main() { int a[8],i=0,ans=0,end; start: printf("2進数を10進数に変換するプログラム\n開始する場合は1を入力終了する場合は0を入力してください。\n"); scanf("%d",&end); if(end==1) { goto s1; } else if(end==0) { goto end; } { s1: for(i=0;i<8;i++) { scanf("%d",&a[i]); } for(i=0;i<8;i++) { a[i]=2^i; } for(i=0;i<8;i++) { ans=ans+a[i]; } printf("二進数"); for(i=8;i<=4;i--) { printf("%d",a[i]); } printf(" "); for(i=4;i<=0;i--) { printf("%d",a[i]); } printf("は%dです。\n",ans); goto start; } end: printf("終了します\n"); } 期待した結果が得られないのですがどこが違っているのか教えていただきたいです、お願いします。

  • 【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

専門家に質問してみよう