- ベストアンサー
100未満の素数出力の最後
- 100未満の数の中で素数を出力し、最後に表示する方法について考えています。現在、コードを実行しても0か1しか表示されません。
- コードは100未満の素数を見つけるためのアルゴリズムですが、現在の実装では正しく素数を表示できていません。
- 素数を判定するためのフラグ配列を用意しているものの、フラグの更新が正しく行われていないことが原因で表示結果が正しくないようです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>prime[i]=i*2; >ですよね? 違います。 prime[]には、素数か素数でないか、つまり0か1しか入らない仕様ですよね。 2*iが素数でないことがわかったのですから、prime[2*i]=0;です。理解できますか?
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
> 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 文て覚えてますか?
お礼
めっちゃ考えて、少しいじったら 無事、表示させることができました。 詳しいアドバイス、 本当にありがとうございました。 すごい助かりました<(_ _)>
補足
まだ慣れていなくてforの中にforが入っていたら個人的にこんがらがってしまうので;; 表示したいのはprime[X]の値ではなくXです。 if文は学びました。
- asuncion
- ベストアンサー率33% (2127/6289)
>prime[i];//←prime[i]に2の倍数を入れてるつもりです。 この文では、prime[i]に対して「何もしていません」。
補足
おぉ。つまり prime[i]=i*2; ですよね? もう少しヒントがほしいです。
お礼
めっちゃ考えて、少しいじったら 無事表示させることができました。 頭の悪い自分に何度も教えてくださり ありがとうございます。 助かりました<(_ _)>
補足
なるほど・・・!! 何度もありがとうございます。 いま、0から100までの素数を0と1で表現できるところまで来ました。 あとは0を表示させないようにすることと、 1を数値化することです。