ページ 1 / 1
n以下の素数列挙
Posted: 2007年11月11日(日) 13:26
by orz
明日までの提出とかなり切羽詰ってます><
プログラムは2〜100の範囲の自然数nを入力して2〜nの範囲の素数を
すべて表示させるというものです。範囲外なら再度入力もとめるようです。
primeなしです><
試し割り法ってので挑戦してみましたorz
#include <stdio.h>
void main()
{
int i,j,Num;
printf("2〜100の範囲の自然数を入力してください\n");
scanf("%d",&Num);
if(Num < 0 || Num > 100){
printf("範囲外です.再度入力してください.\n");
scanf("%d",&Num);
}
for(i = 3; i <= Num; i++){
for(j =2; j<i/2;j++){
if (i % j != 0){
printf("%d",i);
}}}}
こんなのうったらわけわかめのものがでてきました汗
よろしければ救済お願いしますorz
Re:n以下の素数列挙
Posted: 2007年11月11日(日) 13:30
by orz
ビジュアルスタジオってのつかってます><8のじみたいなのです
書き忘れました><
Re:n以下の素数列挙
Posted: 2007年11月11日(日) 14:06
by 管理人
http://www.tsg.ne.jp/TT/tsg/c/mansaku/P01.html
この辺参考になるでしょうか。
要は、「全部割れなかったら」素数なわけでして、一回の比較で割れなかったからと言って素数とは限りません。
例えば15は2では割れませんが、3では割り切れます。
for(j=① ; j<② ; j++){
if(条件)break;
}
において、breakが行われなかったかどうかは、for文を抜けた後に、iが②になっているかどうかでわかります。
for(i=0;i<10;i++)
でまわった時、最後までfor文が行われたら括弧から出た時、iは10になっています。
それまでに条件にマッチして抜けたのなら10にはなりません。
これを利用して全部割れなかったかどうか判断してください。
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 00:47
by Hermit
例えば、小さい数の方から、倍数を消去していく方法もあります。
何とかのふるいって言うんだけど・・・なんだっけ(^^;
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 01:23
by orz
すみません。breakとかもよくわかりません><
(。-`ω-)ンー わかりませんorz
ヒントいただいたのですがヾ(;´Д`●)ノぁゎゎ
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 02:00
by Hermit
エラトステネスのふるいの方法ではこんな感じかな。
極力簡単に書いたつもりでは有るけど・・・
#include <stdio.h>
#define MAX 100
int main() {
static char buff[MAX+1];
int i;
buff[0] = buff[1] = 1;
for (i = 2; i <= MAX; i++) {
int j;
for (j = i + i; j <= MAX; j += i)
buff[j] = 1;
}
for (i = 0; i <= MAX; i++)
if ( buff == 0)
printf("%d\n",i);
return 0;
}
範囲外の処理は出来そうだったので(良くは見ていないが(^^;)
自分でくっつけてください。
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 02:16
by orz
ありがとうございます。これで何とかのりきれます。ただ、見てもまったくわからないじぶんがorz
あとでがんばってみます><
forとわりざんのよじょうこう?%でがんばろうとしたんですがしっぱいしました
夜更けにありがとうございました。
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 05:15
by orz
本当は for if (eise) while くらいをつかってどうにかしたかったのですが><
まにあいそうにないのでどうにかしてみます。
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 13:38
by 管理人
昨日は1時位には寝てしまったので拝見できませんでした、今日提出だったのにすみません(_ _||)
breakはループ文から抜けるという意味です。
簡単な構文については、
「C言語 入門」 でググルと沢山参考になるサイトが出てきますので、そちらをご覧下さい。
仰るようにforとifだけで出来ますよ。breakは難しいものじゃないですし。
Hermitさんのコードもforとifだけですし、まぁ次の課題で頑張ってください^^;
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 19:23
by Hermit
ホントはこれくらいにしたかったのだけど、
分かるかどうか不安だったので(^^;
#include <stdio.h>
#define MAX 100
int main() {
static char buff[MAX+1];
int i;
buff[0] = buff[1] = 1;
for (i = 2; i <= MAX; i++) {
int j;
if (buff == 0)
if ((j = i * i) <= MAX)
do
buff[j] = 1;
while ((j += i) <= MAX);
}
for (i = 0; i <= MAX; i++)
if ( buff == 0)
printf("%d\n",i);
return 0;
}
<= MAX の部分も、 < sizeof buff の方が好きなんだが・・・変更しにくくなりそうなので。
Re:n以下の素数列挙
Posted: 2007年11月12日(月) 20:47
by orz
なんどもおしえていただきありがとうございました。
方法がわかったので助かりました><
つぎからがんばってみます'`ィ(´∀`∩