n以下の素数列挙

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
orz

n以下の素数列挙

#1

投稿記事 by orz » 18年前

明日までの提出とかなり切羽詰ってます><

プログラムは2〜100の範囲の自然数nを入力して2〜nの範囲の素数を
すべて表示させるというものです。範囲外なら再度入力もとめるようです。
primeなしです><
試し割り法ってので挑戦してみましたorz

#include <stdio.h>
void main()
{
int i,j,Num;
printf("2&#12316;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

orz

Re:n以下の素数列挙

#2

投稿記事 by orz » 18年前

ビジュアルスタジオってのつかってます><8のじみたいなのです

書き忘れました><

管理人

Re:n以下の素数列挙

#3

投稿記事 by 管理人 » 18年前

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にはなりません。
これを利用して全部割れなかったかどうか判断してください。

Hermit

Re:n以下の素数列挙

#4

投稿記事 by Hermit » 18年前

例えば、小さい数の方から、倍数を消去していく方法もあります。
何とかのふるいって言うんだけど・・・なんだっけ(^^;

orz

Re:n以下の素数列挙

#5

投稿記事 by orz » 18年前

すみません。breakとかもよくわかりません><
(。-`ω-)ンー わかりませんorz
ヒントいただいたのですがヾ(;´Д`●)ノぁゎゎ

Hermit

Re:n以下の素数列挙

#6

投稿記事 by Hermit » 18年前

エラトステネスのふるいの方法ではこんな感じかな。
極力簡単に書いたつもりでは有るけど・・・
#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;
}

範囲外の処理は出来そうだったので(良くは見ていないが(^^;)
自分でくっつけてください。

orz

Re:n以下の素数列挙

#7

投稿記事 by orz » 18年前

ありがとうございます。これで何とかのりきれます。ただ、見てもまったくわからないじぶんがorz
あとでがんばってみます><
forとわりざんのよじょうこう?%でがんばろうとしたんですがしっぱいしました

夜更けにありがとうございました。

orz

Re:n以下の素数列挙

#8

投稿記事 by orz » 18年前

本当は for if (eise) while くらいをつかってどうにかしたかったのですが><
まにあいそうにないのでどうにかしてみます。

管理人

Re:n以下の素数列挙

#9

投稿記事 by 管理人 » 18年前

昨日は1時位には寝てしまったので拝見できませんでした、今日提出だったのにすみません(_ _||)
breakはループ文から抜けるという意味です。

簡単な構文については、
「C言語 入門」 でググルと沢山参考になるサイトが出てきますので、そちらをご覧下さい。
仰るようにforとifだけで出来ますよ。breakは難しいものじゃないですし。

Hermitさんのコードもforとifだけですし、まぁ次の課題で頑張ってください^^;

Hermit

Re:n以下の素数列挙

#10

投稿記事 by Hermit » 18年前

ホントはこれくらいにしたかったのだけど、
分かるかどうか不安だったので(^^;
#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 の方が好きなんだが・・・変更しにくくなりそうなので。

orz

Re:n以下の素数列挙

#11

投稿記事 by orz » 18年前

なんどもおしえていただきありがとうございました。
方法がわかったので助かりました><
つぎからがんばってみます'`ィ(´∀`∩

閉鎖

“C言語何でも質問掲示板” へ戻る